Python可嵌入Zip文件不包含lib/site-packages在sys.path中

7
我正在尝试将我们的Python版本从3.4更新到3.6。我们将Python嵌入到C++应用程序中,因此利用新的(自Python 3.5以来)Windows x86 embeddable zip file似乎是合理的选择。然而,我们的应用程序无法执行,因为“lib/site-packages”没有被添加到sys.path变量中。我已经确认在我的机器上安装Python 3.6并从安装位置运行后,sys.path变量包含以下内容(相对于python目录):
'...\\python36.zip'
'...\\DLLs'
'...\\lib'
'...'
'...\\lib\\site-packages'

然而,当我从可嵌入的zip文件在同一台机器上运行时,sys.path变量包含(相对于python目录):

'...\\python36.zip'
'...'
'...\\\n'

在这两种情况下,“lib/site-packages”目录都存在于Python目录中。我没有定义PYTHONPATH环境变量。有谁知道如何使可嵌入的压缩文件与已安装版本的操作方式相同,以确定sys.path
2个回答

9
在提取Python可嵌入压缩文件后,根目录中会有一个名为python36._pth的文件。该文件包含以下文本:
# Uncomment to run site.main() automatically
#import site

正如注释所示,通过删除 '#' 字符,取消注释 import site 语句即可。这样做后,sys.path 变量包含:

'...\\python36.zip'
'...'
'...\\\n'
'...\\lib\\site-packages'

这与已安装版本仍有所不同,但对于我个人来说正是我所需要的。

开始编辑

我还发现可以完全删除python36._pth文件,这将使Python恢复到非可嵌入版本的行为。


谢谢您,删除该文件可以修复sys.path和Pip问题。 - Zombo
1
@Jeff G 我在想直接删除.pth文件会有什么后果?为什么可嵌入的Python要把.pth文件放进去呢? - Bingjie Han
@BingjieHan 我建议阅读在Windows上使用Python,第3.9节:查找模块。相关摘录:“*要完全覆盖sys.path,请创建一个与DLL(python37._pth)同名的._pth文件...当该文件存在时,所有注册表和环境变量都将被忽略,启用隔离模式,并且除非文件中有一行指定import site,否则不会导入site.*” - Jeff G

2

之前的答案对我们不起作用,我们必须修改._pth文件,直接将site-packages文件夹添加到sys.path中。我们正在使用Windows嵌入式Python环境下的Python 3.8。

所以我们的python38._pth文件现在看起来像这样:

python38.zip
.
python38.zip\\site-packages

#Uncomment to run site.main() automatically
import site

明确一点,我们最初只取消了'import site'的注释,但在sys.path中看到的只有python38.zip和python文件夹路径,完全没有site-packages。

因此,如果取消了'import site'行的注释后仍无法正常工作,请尝试显式添加所需路径。

我们还尝试在我们的._pth文件中添加了以下内容。

python38.zip/site-packages

而且在 Windows 上也可以使用,'/' 会自动地被正确替换为 '\',site-packages 仍然在 sys 路径中可用。


1
根据您的帖子,似乎您正在python38.zip/site-packages目录中添加类/模块。 这与原始问题略有不同,但可能对其他试图找出在嵌入式ZIP存档中添加路径语法的人有所帮助。 - Jeff G
2
嗯,看起来是这样的,但是在尝试将类和模块放入site-packages(似乎是python38.zip\site-package中readme.txt推荐的)之后,结果对我们来说是个可怕的想法...我认为将自己的包/模块放入Python可嵌入文件的最佳方法是将它们放在与Python可执行文件相同的文件夹中。这样它们就不会在一个压缩存档中,这限制了您只能使用py和pic文件,而不允许使用.so和.pyd文件。 - jeducious
1
你的评论让我意识到我的问题/答案没有充分解释我的目录结构。我提取了可嵌入的ZIP归档文件,然后在python38.zip旁边添加了一个名为“lib/site-packages/”的子目录,其中包括我的自定义软件包。从未向python38.zip文件中添加或删除任何内容。 - Jeff G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接