python-2.7 - pylint 找不到 google.cloud

标签 python-2.7 pylint google-cloud-sdk

我已经安装了 Google Cloud SDK 并希望我正在编写的代码通过 pylint。不幸的是,任何时候我从谷歌导入任何东西。*我收到一个错误:

E: 10, 0: No name 'cloud' in module 'path/to/my/current/module.google' (no-name-in-module)
E: 10, 0: Unable to import 'google.cloud' (import-error)

版本:
$: pylint --version
pylint 1.7.0, 
astroid 1.5.0
Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4]

如果我在 pylint 中放置一个钩子(Hook)以打印出 sys 路径,我将没有什么有趣的。 google-cloud-sdk 位于 /usr/local/lib/python2.7/dist-packages所以它应该能够找到它。
['/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/local/lib/python2.7/dist-packages/pylint-1.7.0-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/backports.functools_lru_cache-1.3-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/configparser-3.5.0-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/singledispatch-3.4.0.3-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/editdistance-0.3.1-py2.7-linux-x86_64.egg', '/usr/local/lib/python2.7/dist-packages/mccabe-0.6.1-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/astroid-1.5.0-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/wrapt-1.10.10-py2.7-linux-x86_64.egg', '/usr/local/lib/python2.7/dist-packages/lazy_object_proxy-1.2.2-py2.7-linux-x86_64.egg', '/usr/lib/python2.7/dist-packages']

有谁知道它为什么在我的本地路径中查找“google”模块以及如何修复它?

更新有关我的环境的更多详细信息:

有问题的 Google Cloud SDK 模块位于:
/usr/local/lib/python2.7/dist-packages/google
如果我 ls它显示的那个目录:
api auth cloud gapic gax iam ...
如果我遵循这些路径,所有模块都在我希望它们被赋予导入语句的地方。

但是,没有__init__.py文件,这让我觉得他们正在使用隐式命名空间包。所以这里的相关问题似乎是:如何让 pylint 识别隐式命名空间包?文档说它应该“正常工作”:

https://docs.pylint.org/en/latest/user_guide/run.html?highlight=re

作为记录,使用 mypy 时出现了同样的问题。

最佳答案

更新(2):

事实证明,我正在从事的 Google App Engine 项目中可能有一个解决方案:

def fixup_paths(path):
    """Adds GAE SDK path to system path and appends it to the google path
    if that already exists."""
    # Not all Google packages are inside namespace packages, which means
    # there might be another non-namespace package named `google` already on
    # the path and simply appending the App Engine SDK to the path will not
    # work since the other package will get discovered and used first.
    # This emulates namespace packages by first searching if a `google` package
    # exists by importing it, and if so appending to its module search path.
    try:
        import google
        google.__path__.append("{0}/google".format(path))
    except ImportError:
        pass

    sys.path.insert(0, path)

# and then call later in your code:
fixup_paths(path_to_google_sdk)

我真的希望这会有所帮助!

更新(1):

这是我找到的一个可能的解决方案:No module named cloud while using google.cloud import bigquery

在那篇文章中,问题是 python 2.7 脚本试图从 google.cloud 导入。 ,并且由于隐式命名空间问题而失败。解决方案是:

幸运的是,在 Python 2.7 中,您可以通过避免隐式导入轻松解决此问题。只需将其添加到文件的顶部:
from __future__ import absolute_import

原答案:

您能否发布您的导入声明,google/cloud.py 的完整路径或任何您尝试导入的内容,google 的内容您尝试从中导入的模块,以及当前模块的内容?

如果没有这些信息,就很难探索这个问题。我最初的预感是您缺少 __init__.py ,无论是在您当前的模块中还是在 google 模块中。如图this post ,您的代码可以在没有 __init__.py 的情况下正常运行在您的模块中,但如果 pylint 从您的模块外部运行,那么如果没有它,它可能无法正确看到您的模块。

我怀疑丢失 __init__.py 的原因在 google 模块中是因为在 PEP 420在 python 3 中,他们放弃了对 __init__.py 的要求,并且我看到人们试图从为 python 3 设计的谷歌模块导入并且省略了 __init__.py这在 python 2 中是必需的。

如果这些都不是,那么您尝试导入的模块可能位于位于 /usr/local/lib/python2.7/dist-packages 的 google-cloud-sdk 目录中的几个目录中。 ,而不是 google-cloud-sdk 目录的直接子目录,并且您的代码通常看到的 python 路径说明了这一点,而 pylint 看到的 python 路径没有。

关于python-2.7 - pylint 找不到 google.cloud,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43264212/

相关文章:

python - PyLint:使用可能未定义的循环变量警告

Google Cloud App Engine 中的 Angular 7 路由不起作用

python-2.7 - 如何安装 PyGObject?

linux - 如何测试程序无法连接到 Internet 时的行为?

python - 实现二分查找

Python:避免关于太多参数的 Pylint 警告

python - 将词典列表保存到 .tsv 文件

python - 在 PyLint 上,使用 rcfile 禁用特定文件上的特定警告

google-cloud-platform - 云SDK : gcloud sql instances describe throws error 404: The Cloud SQL instance does not exist

google-cloud-platform - 无法使用 gcloud-sdk 保持与 VM 的 SSH 连接