【问题标题】:Python Embeddable Zip File Doesn't Include lib/site-packages in sys.pathPython 可嵌入 Zip 文件在 sys.path 中不包含 lib/site-packages
【发布时间】:2017-11-10 14:43:23
【问题描述】:

我正在尝试将我们的 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,有谁知道如何让可嵌入的 zip 文件与安装的版本一样?

【问题讨论】:

    标签: python python-3.6


    【解决方案1】:

    解压Python可嵌入zip文件后,有一个文件叫 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 以及
    • @Jeff G 我想知道直接删除 .pth 文件是否会产生一些后果?为什么可嵌入python将.pth文件放入其中?
    • @BingjieHan 我推荐阅读Using Python on Windows, Section 3.9: Finding Modules。相关摘录:“要完全覆盖sys.path,创建一个与DLL同名的._pth文件(python37._pth)...当文件存在时,忽略所有注册表和环境变量,隔离模式是启用,除非文件中的一行指定import site,否则不会导入站点。"
    【解决方案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
    

    需要明确的是,我们最初运行 python 时只是没有注释“导入站点”,我们在 sys.path 中看到的只是 python38.zip 和 python 文件夹路径,根本没有站点包。

    所以对于所有可能在这里冒险的人,如果取消注释“导入站点”行不适合您,请尝试明确添加您想要的路径。

    还在我们的 ._pth 文件中尝试了以下操作

    python38.zip/site-packages
    

    这也适用于 Windows,'/' 自动正确替换了 '\' 并且站点包仍在 sys 路径中并且可用

    【讨论】:

    • 根据您的帖子,您似乎正在 python38.zip/site-packages 目录中添加类/模块。这是一个与原始问题略有不同的用例,但可能有助于其他人试图找出在嵌入式 ZIP 存档中添加路径的语法。
    • 好吧,它可能看起来像那样,但是在尝试将类和模块放入站点包(似乎是 python38.zip\\site-package 中的 readme.txt 推荐的)之后,它变成了这对我们来说是个糟糕的主意。我相信将自己的包/模块放入 python 嵌入的最佳方法是将它们放在与 python 可执行文件相同的文件夹中。这样它们就不会在压缩存档中,这限制了您只能使用 py 和 pic 文件,不允许使用 .so 和 .pyd 文件。
    • 您的评论让我意识到我的问题/答案没有充分解释我的目录布局。我提取了可嵌入的 ZIP 存档,然后在 python38.zip 旁边添加了一个子目录“lib/site-packages/”,其中包括我的自定义包。从未在 python38.zip 文件中添加或删除任何内容。
    猜你喜欢
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2023-03-28
    • 2021-09-13
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    相关资源
    最近更新 更多