使用名称冲突的两个 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
我想在单个应用程序中使用两个 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