使用两个具有冲突名称的Python库

时间:2016-12-30 16:17:19

标签: python google-app-engine virtualenv google-cloud-platform python-import

我想在一个应用程序中使用两个Python库(Google的Cloud Library及其Cloud SDK),但它们的名称相互冲突(它们在基本导入名称中都使用google并且不要在内部使用相对导入。我如何在一个应用程序中使用它们?

更改库的代码以使用正确的相对导入是不切实际的。另外,我知道我可以使用virtualenv从不同的python应用程序访问这些库,但是如何在同一个python应用程序中访问它们?

命名冲突的详细信息

以下是导入的一些细节。当我从云库导入模块时(我运行import google.cloud.datastore),该库中有另一个导入的例外:

>>> import libs.google.cloud.datastore
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\[ProjectDIR]\libs\google\cloud\datastore\__init__.py", line 52, in <module>
    from google.cloud.datastore.batch import Batch
ImportError: No module named cloud.datastore.batch

图书馆试图进行绝对导入,而不是相对导入。 Google Cloud Library无法导入google.cloud.datastore.batch的原因是因为SDK中已定义google,因此存在命名冲突:

>>> print google.__path__
['C:\\Program Files (x86)\\Google\\Cloud SDK\\google-cloud-sdk\\platform\\google_appengine\\google']

由于Cloud Library使用绝对导入,并且SDK中已定义了名称google,因此导入失败。

1 个答案:

答案 0 :(得分:7)

google包注意将自己注册为名称空间包。如果设置正确sys.path,则此处没有冲突

您需要正确设置库环境。使用以下命令在项目的根目录中添加appengine_config.py文件:

from google.appengine.ext import vendor

# Add any libraries installed in the "lib" folder.
vendor.add('lib')

这会在lib的正确位置添加sys.path子目录。请参阅在App Engine上开发Python应用程序操作方法中的Installing a third-party library section

从此处开始导入google.cloud 只需工作

$ ls -1d lib *.py *.yaml
app.yaml
appengine_config.py
lib
main.py
$ pip install -t lib google-cloud
# installing into the lib subdirectory
$ cat main.py
import google
from google.cloud import datastore
from google.appengine.api import memcache
import os.path

here = os.path.dirname(os.path.abspath(__file__))

def app(*args, **kwargs):
    return '''
google: {}<br />
google.cloud.datastore: {}<br />
google.appengine.api.memcache: {}'''.format(
        os.path.relpath(google.__file__, here),
        os.path.relpath(datastore.__file__, here),
        os.path.relpath(memcache.__file__, here))

并在浏览器中提供服务:

google: ../google-cloud-sdk/platform/google_appengine/google/__init__.py
google.cloud.datastore: lib/google/cloud/datastore/__init__.pyc
google.appengine.api.memcache: ../google-cloud-sdk/platform/google_appengine/google/appengine/api/memcache/__init__.pyc