我正在尝试运行一个 python 脚本,该脚本模拟交通传感器将数据实时发送到我的 Google Cloud Shell 上的 PubSub。我收到这个错误

Traceback (most recent call last):
  File "./send_sensor_data.py", line 87, in <module>
    psclient = pubsub.Client()
AttributeError: 'module' object has no attribute 'Client'

尝试运行 google.cloud.pubsub.__file__ ,不存在重复项。
我一直在到处搜索,普遍的共识是将 pubsub 包安装到我试图无济于事的虚拟环境中。
到目前为止我尝试过的:
  • 将 VM 设置为清理状态
  • 卸载并重新安装所有 gcloud 组件
  • 将所有 gcloud 组件更新到最新版本
  • 卸载并重新安装了 python pubsub 库
  • 在 vi​​rtualenv 中安装了 pubsub
  • 从不同的项目中尝试过
  • 从其他 GCP 帐户尝试

  • 这是我的脚本:
    import time
    import gzip
    import logging
    import argparse
    import datetime
    from google.cloud import pubsub
    
    TIME_FORMAT = '%Y-%m-%d %H:%M:%S'
    TOPIC = 'sandiego'
    INPUT = 'sensor_obs2008.csv.gz'
    
    def publish(topic, events):
       numobs = len(events)
       if numobs > 0:
          with topic.batch() as batch:
             logging.info('Publishing {} events from {}'.
                        format(numobs, get_timestamp(events[0])))
             for event_data in events:
                  batch.publish(event_data)
    
    def get_timestamp(line):
       # look at first field of row
       timestamp = line.split(',')[0]
       return datetime.datetime.strptime(timestamp, TIME_FORMAT)
    
    def simulate(topic, ifp, firstObsTime, programStart, speedFactor):
       # sleep computation
       def compute_sleep_secs(obs_time):
            time_elapsed = (datetime.datetime.utcnow() - programStart).seconds
            sim_time_elapsed = (obs_time - firstObsTime).seconds / speedFactor
            to_sleep_secs = sim_time_elapsed - time_elapsed
            return to_sleep_secs
    
       topublish = list()
    
       for line in ifp:
           event_data = line   # entire line of input CSV is the message
           obs_time = get_timestamp(line) # from first column
    
           # how much time should we sleep?
           if compute_sleep_secs(obs_time) > 1:
              # notify the accumulated topublish
              publish(topic, topublish) # notify accumulated messages
              topublish = list() # empty out list
    
              # recompute sleep, since notification takes a while
              to_sleep_secs = compute_sleep_secs(obs_time)
              if to_sleep_secs > 0:
                 logging.info('Sleeping {} seconds'.format(to_sleep_secs))
                 time.sleep(to_sleep_secs)
           topublish.append(event_data)
    
       # left-over records; notify again
       publish(topic, topublish)
    
    def peek_timestamp(ifp):
       # peek ahead to next line, get timestamp and go back
       pos = ifp.tell()
       line = ifp.readline()
       ifp.seek(pos)
       return get_timestamp(line)
    
    
    if __name__ == '__main__':
       parser = argparse.ArgumentParser(description='Send sensor data to Cloud Pub/Sub in small groups, simulating real-time behavior')
       parser.add_argument('--speedFactor', help='Example: 60 implies 1 hour of data sent to Cloud Pub/Sub in 1 minute', required=True, type=float)
       args = parser.parse_args()
    
       # create Pub/Sub notification topic
       logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.INFO)
       psclient = pubsub.Client()
       topic = psclient.topic(TOPIC)
       if not topic.exists():
          logging.info('Creating pub/sub topic {}'.format(TOPIC))
          topic.create()
       else:
          logging.info('Reusing pub/sub topic {}'.format(TOPIC))
    
       # notify about each line in the input file
       programStartTime = datetime.datetime.utcnow()
       with gzip.open(INPUT, 'rb') as ifp:
          header = ifp.readline()  # skip header
          firstObsTime = peek_timestamp(ifp)
          logging.info('Sending sensor data from {}'.format(firstObsTime))
          simulate(topic, ifp, firstObsTime, programStartTime, args.speedFactor)
    

    最佳答案

    pubsub.Client 类一直存在到 pubsub python 包的 0.27.0 版本。所以我只是创建了一个虚拟环境,并在其中安装了 0.27.0 版本的 pubsub。
    以下是命令:

    virtualenv venv
    source venv/bin/activate
    pip install google-cloud-pubsub==0.27.0
    

    关于python - 如何修复 AttributeError : 'module' object has no attribute 'Client' when running python in Google Cloud Interactive Shell,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47362736/

    10-11 19:23