gpt4 book ai didi

python - 两个pip安装的模块同名,如何选择加载哪个?

转载 作者:行者123 更新时间:2023-12-04 15:07:12 35 4
gpt4 key购买 nike

我正在写一个 python program依赖于特定模块,rtmidi .事实是,PyPI 中至少有两个不同的包有一个同名的模块,rtmidipython-rtmidi .它们提供几乎相同的功能,但具有不同的语法。
当只安装了“正确”的包时,一切正常。但是如果两个包都安装了,使用 import rtmidi加载“错误”模块,我的程序崩溃了。让它再次工作的唯一方法是卸载这两个软件包,然后重新安装正确的软件包。当然,由于用户可能依赖于其他模块的其他程序,我不能指望他们这样做。
试图用 rtmidi.__name__ 识别模块两个包的结果相同。
所以我的问题是,我该如何解决这个名称冲突问题?有没有最佳实践方法来处理这个问题?

最佳答案

您不能同时安装它们(如果依赖默认 pip 行为)。在这里,我将使用几个具有导入名称冲突的简单纯 Python 包进行演示:coverallspython-coveralls .

# in a fresh environment
pip install python-coveralls
python -c "import coveralls; print(dir(coveralls)); print(coveralls.__file__)"
# ['__author__', '__builtins__', '__cached__', '__classifiers__', '__copyright__',
# '__doc__', '__docformat__', '__file__', '__license__', '__loader__', '__name__',
# '__package__', '__path__', '__spec__', '__version__', 'parse_args', 'wear']
# /path/to/lib/python3.8/site-packages/coveralls/__init__.py
这些是 python-coveralls的内容.注意实际 __init__.py文件位于 site-packages/coveralls/目录。
pip install coveralls
python -c "import coveralls; print(dir(coveralls)); print(coveralls.__file__)"
# ['Coveralls', '__all__', '__builtins__', '__cached__', '__doc__', '__file__',
# '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__',
# 'api', 'exception', 'git', 'reporter', 'version']
# /path/to/lib/python3.8/site-packages/coveralls/__init__.py
这些是 coveralls的内容. python-coveralls已被覆盖。请注意,这是同一个文件。旧的任何东西 __init__.py离开了。
pip uninstall coveralls
python -c "import coveralls; print(dir(coveralls)); print(coveralls.__file__)"
# ['__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__',
# '__spec__']
# None
那里仍然有一个包的幽灵,但它的内容已经消失了(除了所有包内部都有的东西)。请注意,文件现在是 None : 没有 __init__.py这个包的文件。
您还可以通过运行 pip uninstall python-coveralls 来取消您的环境。然后重新安装任何你想要的。
解决方案
您确实必须要求您的用户只使用符合您要求的软件包,但这就是我们使用虚拟环境的原因。或者,想要直接使用其他包的用户可以使用 --target option to pip 更改安装位置(以及加载时使用的名称)。 (但这不会帮助使用其他库的其他应用程序)。
在实践中,最好将此视为安装过程的一部分。您要么需要 (a) 告诉您的用户他们需要安装什么要求;或者 (b) 有一些自动化流程可以满足正确的要求。
我想说最好的做法是(b)。执行此操作的常用方法是使用 setuptools ,并定义 install_requires setup 的论据功能。这是指 PyPI 上的包名称,而不是导入名称。 The setuptools quickstart是一个很好的起 pip 。

关于python - 两个pip安装的模块同名,如何选择加载哪个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65901845/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com