我已经安装了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中放一个钩子来打印出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 Cloud SDK模块位于:
/usr/local/lib/python2.7/dist-packages/google
如果我在那个目录中显示:
api auth cloud gapic gax iam …
如果我遵循这些路径,所有模块都在我希望它们被赋予import语句的地方.
但是,没有__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模块的内容以及您当前模块的内容?
没有这些信息,很难探讨这个问题.我最初的预感是,您在当前模块或Google模块中缺少__init__.py.如this post所示,您的代码可以在模块中没有__init__.py的情况下正常运行,但是如果pylint从模块外部运行,那么没有它就可能无法正常查看模块.
我怀疑谷歌模块中缺少__init__.py的原因是因为在PEP 420的python 3中,他们放弃了对__init__.py的要求,我看到了人们试图从谷歌模块导入的问题,这些模块是为python 3设计的,并省略了python 2中所需的__init__.py.
如果不是这种情况,那么您尝试导入的模块可能位于google-cloud-sdk目录中的几个目录中,该目录位于/usr/local/lib/python2.7/dist-packages,如反对成为google-cloud-sdk目录的直接子项,而你的代码通常看到的python路径就是这个,而pylint看到的python路径却没有.