मैं serverless-google-cloudfunctions का उपयोग करके python37 के साथ एक Google क्लाउड फ़ंक्शन परिनियोजित कर रहा हूं। यह फ़ंक्शन संदेश प्रकाशित करने के लिए pubsub API का उपयोग करता है। हालांकि, मुझे निम्न त्रुटि मिल रही है:

ImportError: cannot import name 'cygrpc' from 'grpc._cython'

ऐसा लगता है क्योंकि आप आवश्यकताएँ.txt के साथ एक सी लाइब्रेरी स्थापित नहीं कर सकते हैं। मैं इसे कैसे ठीक करूं? मेरा कोड नीचे है।

from google.cloud import pubsub

publisher = pubsub.PublisherClient()
path = publisher.topic_path("my_proj", "my_topic")

publisher.publish(path, "test".encode("utf-8"))

मेरी आवश्यकताएँ.txt निम्नलिखित है। मैंने बिना किसी लाभ के grpcio==1.22.0 जोड़ने का प्रयास किया है।

google-cloud-pubsub==0.45.0

मेरा सर्वर रहित.yml:

service: my-service

provider:
    name: google
    stage: ${opt:stage, 'dev'}
    runtime: python37
    region: us-central1
    project: ${self:custom.env.PROJECT_NAME}
    credentials: ~/.gcloud/keyfile.json

plugins:
  - serverless-google-cloudfunctions
  - serverless-python-requirements

custom:
    pythonRequirements:
        fileName: private_requirements.txt
        pythonBin: python3
        noDeploy:
            - requirements.txt
    stage:
        ${self:provider.stage}
    env:
        ${file(./.env.${self:provider.stage})}

package:
    include:
        - requirements.txt
    exclude:
        - .git/**
        - .gitignore
        - env*
        - node_modules/**
        - package.json
        - private_requirements.txt
        - yarn.lock

functions:

    my-func:
        handler: func
        events:
            - http: path
0
woodpav 26 अगस्त 2019, 22:05

1 उत्तर

सबसे बढ़िया उत्तर

मैंने इस समस्या का अनुभव किया क्योंकि मैं बिना डॉकटर के सर्वर रहित ढांचे का उपयोग कर रहा था। वर्तमान में (29 अगस्त, 2019 तक) एक बग है सर्वर रहित-पायथन-आवश्यकताएं जो निजी रिपॉजिटरी के साथ पीआईपी को डॉक करने से रोकती हैं।

मेरा समाधान सर्वर रहित निकालना और gcloud CLI में बदलना था। जब आप GCloud पर आवश्यकताएँ.txt अपलोड करते हैं तो यह स्वचालित रूप से सार्वजनिक को स्थापित करता है, लेकिन निजी रेपो स्थापित नहीं कर सकता क्योंकि इसमें git क्रेडेंशियल नहीं होते हैं। इससे बचने के लिए, आपको पैकेज को gcloud पर अपलोड करने से पहले उन आवश्यकताओं को स्थानीय रूप से स्थापित करना होगा।

मेरे समाधान के लिए यहां एक लिंक है

1
woodpav 30 अगस्त 2019, 21:06