Google Cloud Function - ImportError: cannot import name 'pubsub' from 'google.cloud' (unknown location)

Jed picture Jed · Sep 22, 2018 · Viewed 7.9k times · Source

I am deploying a Google Cloud Function that will kick off other Google Cloud Functions using google.cloud.pubsub_v1 and I'm getting this error ImportError: cannot import name 'pubsub' from 'google.cloud' (unknown location)

The beginning of my requirements.txt file looks like this

# Function dependencies, for example:
# package>=version
google-cloud-pubsub
....

The beginning of my main.py script looks like this:

import base64
import json
from google.cloud import pubsub_v1

publisher = pubsub_v1.PublisherClient()
topic_path = publisher.topic_path(<PROJECT_ID>, <PUBSUB_TOPIC>)

I am deploying this code from a Google Cloud Source Repository. I have read through this SO post about my error, but that question appears to be about this error arising in a Client application. My error is being generated by the Google Cloud function itself during the deploy process. I don't have sudo rights to the auto-created VM that Google is using to run my process, do I? I should be able to resolve this issue from the requirements.txt file, but nothing I've tried seems to be working.

What's more frustrating is that when I put this same code in the "Inline editor" on the web-based Google Function editor, I don't get an error. I only get this error when loading the code from the repository.

The current file structure in the repository looks something like this:

.
├── package
|   ├── main.py
|   ├── script1.py
|   └── script2.py
├── package2
├── ...
└── requirements.txt

I moved main.py inside of a package because of issues I was having in this SO Question

Any ideas on how to resolve this import error?

Answer

Dustin Ingram picture Dustin Ingram · Sep 24, 2018

Your main.py file and requirements.txt file should be in the same directory, and this should also be the same directory you're deploying your function from.

Also, the google-cloud package is deprecated and shouldn't be used with other google-cloud-* packages. You should remove it from your requirements.txt file.