2

내 Google에서 PubSub에 실시간으로 데이터를 보내는 트래픽 센서를 시뮬레이트하는 python 스크립트를 실행하려고합니다. 클라우드 쉘. 나는이 오류 google.cloud.pubsub.__file__를 실행 시도AttributeError 문제를 해결하는 방법 : Google Cloud Interactive Shell에서 Python을 실행할 때 '모듈'객체에 '클라이언트'속성이 없습니다.

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

을 얻고, 더 중복이 존재하지 않습니다. 저는 어디에서나 검색을 해왔습니다. 대중적인 공감대는 pubsub 패키지를 가상 환경에 설치하여 아무런 노력을하지 않으려 고했습니다. 지금까지 시도했다 : 최신 버전

  • uninsalled 모든 gcloud 구성 요소를 업데이트하고 상태를
  • 제거 된 청소 VM

    • 설정을 다시 설치 모든 gcloud 구성 요소
    • 는 파이썬 pubsub 라이브러리
    • 을 다시 설치
    • 가상 서버 내에 설치된 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) 
    
  • 답변

    1

    pubsub.Client 클래스는 pubsub 파이썬 패키지의 0.27.0 버전까지 존재 참조 선택해야 . 그래서 방금 가상 환경을 만들고 0.27.0 버전의 pubsub를 설치했습니다. 다음은 명령입니다.

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