当前位置: 首页 > 面试题库 >

使用两个名称冲突的Python库

郭单鹗
2023-03-14
问题内容

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

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

命名冲突的详细信息

以下是有关导入的一些详细信息。当我从Cloud Library导入模块(运行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的原因google是因为SDK中已经定义了该命名空间,因此存在命名冲突:

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

由于云库使用绝对导入,并且名称google已经在SDK中定义,因此导入失败。


问题答案:

这些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。请参阅 安装第三方库
部分
开发Python应用程序在App Engine上 操作方法

从这里开始,导入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软件包。 http://www.alembic.io/updates.html https://pypi.python.org/pypi/alembic 是否有规范或Python方式处理名称冲突的两个软件包的安装?到目前为止,我在开发/构建过程中仅偶尔需要一个软件包,因此我一直在使用单独的virtualenv来处理冲突,但是这使构建步骤变得更加复

  • 问题内容: 考虑以下jfiddle http://jsfiddle.net/bchapman26/9uUBU/29/ 我有2个模块(module1和module2)。module1和module2都定义了一个名为myService的服务。当两个模块都导入myApp时,这似乎在Angular中的myService上创建了名称冲突。看来AngularJs仅使用第二个服务定义,而没有警告您可能的问题。

  • 我有一个简单的枚举类,我想在其中有一个名为name的字段。 不幸的是,这在静态编程语言中似乎不起作用。编译失败,消息: 错误:(9,5)静态编程语言:冲突声明:枚举条目名称,公共最终val名称:字符串 同样的Enum类作为Java代码工作正常。如何用静态编程语言解决这个问题?

  • 问题内容: 我将这个问题作为作业: 包装/命名 我们创建了很多程序包,并在其中定义了类和接口。我们还讨论了命名它们时必须记住的要点。在本次作业中,我们将了解命名的重要性。 请更改上一个作业中的程序包名称,以使两个程序包具有相同的名称,并分析将引发的结果/错误。 我的怀疑: 我无法想到一种方法(场景)来证明所要求的内容。由于Java导入是绝对的,因此所描述的情况似乎不可能产生(IMO)。 请帮我示范

  • 在实现第三方API(mollie)时,他们似乎将支持分页的参数之一命名为from,这与内置的python相冲突。 有没有办法让我正确使用这个?我没有正确传递参数吗?注意:它们被写成。 它唯一支持的参数是:和。 给予:

  • 我的Gradle项目中有两个依赖项库: OLD:完全使用lib 新:只有db库(固定库) 它们都拥有相同的数据库连接类,包括包,例如:net。我的公司。常见的dbsq。DBConnector()。 我需要的是确保使用新的db连接类,但由于所需的UTIL的其余部分在新的数据库中不可用,所以保留旧的(可以没有db类)作为依赖项。 是否有可能仅排除/包括依赖项的特定类或包?或者确保相同命名类的“重写”?