繁体   English   中英

在本地安装 python 包并不总是有效

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM