[英]Installing python packages locally doesn't always work
我正在创建一个 python 3.9 程序并想在本地安装包。 所以我的项目设置方式是这样的:
__main__.py
test.py
requirements.txt
lib/
__init__.py
在我的 requirements.txt 文件中,我有 3 行:
colorama==0.2.2
click==8.0.3
pendulum==2.1.2
然后我运行: python -m pip install -r requirements.txt -t ./lib
这将安装 lib 目录中的所有包和依赖项。
然后我在 test.py 文件的顶部导入模块:
from lib import colorama
from lib import click
from lib import pendulum
在做一些测试时,我发现 colorama 工作正常。 我将在一个简单的测试中使用它: print(colorama.Fore.BLUE + "Hello, World!")
。 控制台中的文本为蓝色,一切正常。
然后我尝试使用其他包,我得到 ModuleNotFoundError 异常: print(pendulum.now('Europe/Paris'))
Exception has occurred: ModuleNotFoundError - No module named 'pendulum'
这是来自它自己的文件之一。
当我使用 Click 时也会发生同样的事情,但它有点不同。 我会得到相同的 ModuleNotFound 异常,但这是因为它对 Colorama 的依赖。 我不认为这与我还导入 Colorama 的事实有关,因为如果我卸载我会得到同样的错误。
我也用 python-docx 包试过这个。 我将 python-docx==0.8.11 添加到 requirements.txt 文件,然后发出与上面相同的命令安装到我的本地 lib 目录。 安装好像没问题。 我看到了 docx 目录及其所有依赖项。 然后我from lib import docx
然后在 test.py 中做一些简单的事情: doc = docx.Document()
然后得到ModuleNotFound错误:文件“C:\\ Users \\用户名\\开发\\蟒蛇\\测试本地包\\ LIB \\ docx_初始化_.py”,3号线,在(当前)无模块命名为'DOCX'
有谁知道我做错了什么?
当您将这些库放入lib
文件夹并按照您的方式导入它们时,您正在更改它们的包名称。 colorama
不再是顶级包,它现在是lib.colorama
。 一些库可能对此没问题,但对于其他库,他们希望能够使用正常名称导入自己的代码。 如果colorama.some_submodule
尝试import colorama
,它将失败。
重要的是要意识到像from lib import colorama
这样的语句不会改变在任何地方都能找到colorama
方式。 它只更改本地命名空间。 包仍然是lib.colorama
,我们只是将它绑定到当前模块中的名称colorama
。
正如 JonSG 在评论中所建议的那样,更好的解决方案是将lib
文件夹放入 Python 搜索路径,以便import colorama
找到具有正常名称的包。 修改sys.path
是一种方法,另一种方法是PYTHONPATH
环境变量(可能不适合您当前的问题,但有时在其他情况下有用)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.