google.cloud __init__.py 中的命名空间导入错误
google.cloud namespace import error in __init__.py
我已经通读了至少十几个不同的 Whosebug 问题,它们都提出了相同的基本问题并有相同的基本答案:模块安装不正确或 OP 导入错误。
在这种情况下,我正在尝试做 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
命名空间和 __init__.py
文件中该命名空间内的 secretmanager
包的问题。
如果我将 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 和 airflow 正在修复一些我不知道的问题,当我尝试手动 运行 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
而且我不小心省略了上面 pip 和 python 安装命令示例中的 --user
标志。在我的容器环境中,所有内容都使用全局 site-packages
目录中的 --user
和 NOT 安装到用户的主目录中。
更新 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
在 运行ning python dags/my_dag.py
和 运行ning airflow list_dags
或 [=42] 时看起来一样=].
仍然得到同样的错误。
查看更新版本的文档,我注意到您应该 能够from google.cloud import secretmanager
。这给了我相同的结果(适用于气流和 pytest,而不是直接尝试 运行 时)。
在这一点上,我最好的猜测是它与命名空间魔法有关,但我不确定?
经过反复试验,问题是如果之前没有从 google.cloud.
导入另一个包,目前无法从 google.cloud 命名空间导入 secretmanager
例如
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
必须通过终端安装:pip install google-cloud-secret-manager
因为包名不是 secretmanager 而是 google-cloud-secret-manager
与 Noah 的回答类似,这解决了我的问题,而无需导入不需要的模块:
import google.cloud.secretmanager as secretmanager
我正在使用 Python 3.8.2 和 google-cloud-secret-manager
2.7.1。以下行为我解决了这个问题:
from google.cloud import secretmanager_v1beta1 as secretmanager
我已经通读了至少十几个不同的 Whosebug 问题,它们都提出了相同的基本问题并有相同的基本答案:模块安装不正确或 OP 导入错误。
在这种情况下,我正在尝试做 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
命名空间和 __init__.py
文件中该命名空间内的 secretmanager
包的问题。
如果我将 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 和 airflow 正在修复一些我不知道的问题,当我尝试手动 运行 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
而且我不小心省略了上面 pip 和 python 安装命令示例中的 --user
标志。在我的容器环境中,所有内容都使用全局 site-packages
目录中的 --user
和 NOT 安装到用户的主目录中。
更新 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
在 运行ning python dags/my_dag.py
和 运行ning airflow list_dags
或 [=42] 时看起来一样=].
仍然得到同样的错误。
查看更新版本的文档,我注意到您应该 能够from google.cloud import secretmanager
。这给了我相同的结果(适用于气流和 pytest,而不是直接尝试 运行 时)。
在这一点上,我最好的猜测是它与命名空间魔法有关,但我不确定?
经过反复试验,问题是如果之前没有从 google.cloud.
导入另一个包,目前无法从 google.cloud 命名空间导入 secretmanager例如
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
必须通过终端安装:pip install google-cloud-secret-manager
因为包名不是 secretmanager 而是 google-cloud-secret-manager
与 Noah 的回答类似,这解决了我的问题,而无需导入不需要的模块:
import google.cloud.secretmanager as secretmanager
我正在使用 Python 3.8.2 和 google-cloud-secret-manager
2.7.1。以下行为我解决了这个问题:
from google.cloud import secretmanager_v1beta1 as secretmanager