Ошибка импорта пространства имен google.cloud в __init__.py - PullRequest
0 голосов
/ 21 марта 2020

Я прочитал, по крайней мере, дюжину различных вопросов о стековом потоке, которые все представляют одну и ту же проблему с базисным c и имеют один и тот же базовый c ответ: либо модуль установлен неправильно, либо операционная система неправильно выполняет импорт .

В этом случае я пытаюсь сделать from google.cloud import secretmanager_v1beta1.

Он работает в моем контейнере воздушного потока, когда я запускаю airflow dags или если я запускаю pytest tests/dags/test_my_dag.py. Однако, если я запускаю cd dags; python -m my_dag или cd dags; python my_dag.py, я получаю эту ошибку:

from google.cloud import secretmanager as secretmanager
ImportError: cannot import name 'secretmanager' from 'google.cloud' (unknown location)

Я могу добавить from google.cloud import bigquery в строке прямо над этой строкой, и это работает нормально. Кажется, в буквальном смысле просто проблема с этим конкретным пакетом.

Почему имеет значение, если команды pytest и airflow успешно выполняются? Потому что у меня есть другая среда, где я пытаюсь запускать задания потока данных из командной строки, и я получаю ту же ошибку. И, к сожалению, я не думаю, что могу обойти эту ошибку в этой среде по нескольким причинам.

ОБНОВЛЕНИЕ 6

Я сузил ошибку до проблемы с google.cloud пространство имен и пакет secretmanager в этом пространстве имен в файле __init__.py.

Если я добавлю from google.cloud import secretmanager к airflow/dags/__init__.py и затем попытаюсь запустить python -m dags.my_dag.py, я получаю эту ошибку, но с немного другой трассировкой стека:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/runpy.py", line 183, in _run_module_as_main
    mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
  File "/usr/local/lib/python3.7/runpy.py", line 109, in _get_module_details
    __import__(pkg_name)
  File "/workspace/airflow/dags/__init__.py", line 3, in <module>
    from google.cloud import secretmanager
ImportError: cannot import name 'secretmanager' from 'google.cloud' (unknown location)

СТАРАЯ ИНФОРМАЦИЯ

Я на 95% уверен, что это все еще проблема пути, и что Pytest и поток воздуха исправляются что-то, чего я не знаю, не обрабатывается, когда я пытаюсь вручную запустить скрипт python.

То, что я пробовал:

cd /airflow; python setup.py develop --user
cd /airflow; pip install -e . --user
cd /airflow/dags; pip install -r requirements.txt --user

ОБНОВЛЕНИЕ

В соответствии с запросами в комментариях, вот содержание requirements.txt:

boto3>=1.7.84
google-auth==1.11.2
google-cloud-bigtable==1.2.1
google-cloud-bigquery==1.24.0
google-cloud-spanner==1.14.0
google-cloud-storage==1.26.0
google-cloud-logging==1.14.0
google-cloud-secret-manager>=0.2.0
pycloudsqlproxy>=0.0.15
pyconfighelper>=0.0.7
pymysql==0.9.3
setuptools==45.2.0
six==1.14.0

И я случайно опустил флаги --user из пункта и python примеры команд установки выше. В моей среде контейнера все устанавливается в домашний каталог пользователя, используя --user и NOT в глобальном каталоге site-packages.

UPDATE 2

Я добавил следующий код в файл, который генерирует ошибку:

print('***********************************************************************************')
import sys
print(sys.path)
from google.cloud import secretmanager_v1beta1 as secretmanager
print('secretmanager.__file__: {}'.format(secretmanager.__file__))

С airflow list_dags:

['/home/app/.local/bin', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/home/app/.local/lib/python3.7/site-packages', '/home/app/.local/lib/python3.7/site-packages/Jeeves-0.0.1-py3.7.egg', '/home/app/.local/lib/python3.7/site-packages/google_cloud_secret_manager-0.2.0-py3.7.egg', '/home/app/.local/lib/python3.7/site-packages/pyconfighelper-0.0.7-py3.7.egg', '/home/app/.local/lib/python3.7/site-packages/click-7.1.1-py3.7.egg', '/workspace/airflow', '/usr/local/lib/python3.7/site-packages', '/workspace/airflow/dags', '/workspace/airflow/config', '/workspace/airflow/plugins']
secretmanager.__file__: /home/app/.local/lib/python3.7/site-packages/google_cloud_secret_manager-0.2.0-py3.7.egg/google/cloud/secretmanager_v1beta1/__init__.py

С python my_dag.py:

['/workspace/airflow/dags', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/home/app/.local/lib/python3.7/site-packages', '/home/app/.local/lib/python3.7/site-packages/Jeeves-0.0.1-py3.7.egg', '/home/app/.local/lib/python3.7/site-packages/google_cloud_secret_manager-0.2.0-py3.7.egg', '/home/app/.local/lib/python3.7/site-packages/pyconfighelper-0.0.7-py3.7.egg', '/home/app/.local/lib/python3.7/site-packages/click-7.1.1-py3.7.egg', '/home/app/.local/lib/python3.7/site-packages/icentris_ml_airflow-0.0.0-py3.7.egg', '/usr/local/lib/python3.7/site-packages']

ОБНОВЛЕНИЕ 3 tree airflow/dags

airflow/dags
├── __init__.py
├── __pycache__
│   ├── __init__.cpython-37.pyc
│   ├── bq_to_cs.cpython-37.pyc
│   ├── bq_to_wrench.cpython-37.pyc
│   ├── fetch_cloudsql_tables-bluesun.cpython-37.pyc
│   ├── fetch_cloudsql_tables.cpython-37.pyc
│   ├── fetch_app_tables-bluesun.cpython-37.pyc
│   ├── fetch_app_tables.cpython-37.pyc
│   ├── gcs_to_cloudsql.cpython-37.pyc
│   ├── gcs_to_s3.cpython-37.pyc
│   ├── lake_to_staging.cpython-37.pyc
│   ├── schedule_dfs_sql_to_bq-bluesun.cpython-37.pyc
│   ├── schedule_dfs_sql_to_bq.cpython-37.pyc
│   ├── app_to_bq_initial_load-bluesun.cpython-37.pyc
│   ├── app_to_lake-bluesun.cpython-37.pyc
│   └── app_to_lake.cpython-37.pyc
├── bq_to_wrench.py
├── composer_variables.json
├── my_ml_airflow.egg-info
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   ├── dependency_links.txt
│   └── top_level.txt
├── lake_to_staging.py
├── libs
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-37.pyc
│   │   ├── checkpoint.cpython-37.pyc
│   │   └── utils.cpython-37.pyc
│   ├── checkpoint.py
│   ├── io
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   └── __init__.cpython-37.pyc
│   │   └── gcp
│   │       ├── __init__.py
│   │       ├── __pycache__
│   │       │   ├── __init__.cpython-37.pyc
│   │       │   └── storage.cpython-37.pyc
│   │       └── storage.py
│   ├── shared -> /workspace/shared/
│   └── utils.py
├── requirements.txt
├── table_lists
│   └── table-list.json
└── templates
    └── sql
        ├── lake_to_staging.contacts.sql
        ├── lake_to_staging.orders.sql
        └── lake_to_staging.users.sql

11 directories, 41 files

ОБНОВЛЕНИЕ 4

Я попытался исправить это так, чтобы sys.path выглядел То же самое при запуске python dags/my_dag.py, как и при запуске airflow list_dags или pytest test_my_dag.py.

Все равно появляется та же ошибка.

Глядя на более новую версию документации, я заметил, что вы должны быть в состоянии просто сделать from google.cloud import secretmanager. Который дал мне тот же результат (работает с воздушным потоком и pytest, а не при попытке запустить напрямую).

На данный момент, я думаю, что это как-то связано с магией пространства имен c, но я не уверен?

1 Ответ

0 голосов
/ 24 марта 2020

После долгих проб и ошибок проблема заключается в том, что в настоящее время невозможно импортировать secretmanager из пространства имен google.cloud, если ранее он не импортировал другой пакет из google.cloud.

Например.

mod.py

from google.cloud import secretmanager # Fails with error

mod2.py

from google.cloud import bigquery
from google.cloud import secretmanager # Works because the first import initialized the namespace
...