如何修复AttributeError:在Google Cloud Interactive Shell中运行python时,“模块"对象没有属性“客户端" [英] How to fix AttributeError: 'module' object has no attribute 'Client' when running python in Google Cloud Interactive Shell

查看:151
本文介绍了如何修复AttributeError:在Google Cloud Interactive Shell中运行python时,“模块"对象没有属性“客户端"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to run a python script that simulates traffic sensors sending in data in real time to PubSub on my Google Cloud Shell. I'm getting this error

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软件包安装到我尝试不起作用的虚拟环境中. 到目前为止,我已经尝试过:

Tried running google.cloud.pubsub.__file__, no duplicates exist. I've been searching everywhere and the popular consensus was to install the pubsub package into a virtual environment which I've tried to no avail. What I've tried so far:

  • 将虚拟机设置为干净状态
  • 卸载并重新安装了所有gcloud组件
  • 将所有gcloud组件更新为最新版本
  • 未安装并重新安装的python pubsub库
  • 在virtualenv内安装了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. 这是命令:

The pubsub.Client class exists until the 0.27.0 version of the pubsub python package. So I just created a virtual environment and installed the 0.27.0 version of pubsub into it. Here are the commands:

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

这篇关于如何修复AttributeError:在Google Cloud Interactive Shell中运行python时,“模块"对象没有属性“客户端"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆