How to fix AttributeError: 'module' object has no attribute 'Client' when running python in Google Cloud Interactive Shell
How to fix AttributeError: 'module' object has no attribute 'Client' when running python in Google Cloud Interactive Shell
我正在尝试 运行 一个 python 脚本来模拟交通传感器实时向我的 Google 云 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 库
- 在 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
class。你
需要选择 PublisherClient
或 SubscriberClient
参见 https://github.com/GoogleCloudPlatform/google-cloud-python/blob/master/pubsub/google/cloud/pubsub.py
pubsub.Client class 一直存在到 pubsub python 包的 0.27.0 版本。所以我只是创建了一个虚拟环境,并在其中安装了 0.27.0 版本的 pubsub。
以下是命令:
virtualenv venv
source venv/bin/activate
pip install google-cloud-pubsub==0.27.0
Google 云平台的解决方案是:
修改send_senor_data.py文件如下:
a. Comment the original import statement for pub_sub and use _v1 version
#from google.cloud import pubsub
from google.cloud import pubsub_v1
b. Find this code and replace it as follows:
#publisher = pubsub.PublisherClient()
publisher = pubsub_v1.PublisherClient()
- 然后按如下方式执行你的send_sensor_data.py:
./send_sensor_data.py --speedFactor=60 --project=YOUR-PROJECT-NAME
我正在尝试 运行 一个 python 脚本来模拟交通传感器实时向我的 Google 云 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 库
- 在 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
class。你
需要选择 PublisherClient
或 SubscriberClient
参见 https://github.com/GoogleCloudPlatform/google-cloud-python/blob/master/pubsub/google/cloud/pubsub.py
pubsub.Client class 一直存在到 pubsub python 包的 0.27.0 版本。所以我只是创建了一个虚拟环境,并在其中安装了 0.27.0 版本的 pubsub。 以下是命令:
virtualenv venv
source venv/bin/activate
pip install google-cloud-pubsub==0.27.0
Google 云平台的解决方案是:
修改send_senor_data.py文件如下:
a. Comment the original import statement for pub_sub and use _v1 version
#from google.cloud import pubsub from google.cloud import pubsub_v1
b. Find this code and replace it as follows:
#publisher = pubsub.PublisherClient() publisher = pubsub_v1.PublisherClient()
- 然后按如下方式执行你的send_sensor_data.py:
./send_sensor_data.py --speedFactor=60 --project=YOUR-PROJECT-NAME
- 然后按如下方式执行你的send_sensor_data.py: