使用名称冲突的两个 Python 库

Using Two Python Libraries with Conflicting Names

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

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

命名冲突的详细信息

以下是有关导入的一些详细信息。当我从 Cloud Library (I 运行 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云库无法导入google.cloud.datastore.batch是因为SDK中已经定义了google,存在命名冲突:

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

由于云库使用绝对导入,SDK中已经定义了名字google,所以导入失败

google 包注意将自己注册为 namespace 包。正确设置 sys.path 后,此处没有冲突

您需要正确设置图书馆环境。在项目的根目录中添加一个 appengine_config.py 文件:

from google.appengine.ext import vendor

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

这会在 sys.path 的正确位置添加 lib 子目录。请参阅 在 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