带有嵌入式 python 的 pip

Posted

技术标签:

【中文标题】带有嵌入式 python 的 pip【英文标题】:pip with embedded python 【发布时间】:2017-07-28 17:07:05 【问题描述】:

我从here安装了嵌入式python,标题为“Windows x86-64 embeddable zip file”,但它没有安装pip,它也没有站点包,当我尝试做python get-pip.py它失败了运行,因为该文件中有import pip。那么如何在嵌入式 python 环境中安装 pip。

Traceback(最近一次调用最后一次): 文件“.\getpip.py”,第 20061 行,在 主要的() 文件“.\getpip.py”,第 194 行,在 main 引导程序(tmpdir=tmpdir) 引导程序中的文件“.\getpip.py”,第 82 行 进口点子 _find_and_load 中的文件“”,第 961 行 文件“”,第 950 行,在 _find_and_load_unlocked _load_unlocked 中的文件“”,第 646 行 _load_backward_compatible 中的文件“”,第 616 行

目录结构为:

Directory: C:\Downloads\python-3.6.1rc1-embed-win32

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         3/4/2017   7:26 PM         157344 pyexpat.pyd
-a----         3/4/2017   7:26 PM          97952 python.exe
-a----         3/4/2017   7:26 PM          58016 python3.dll
-a----         3/4/2017   7:26 PM        3263648 python36.dll
-a----         3/4/2017   7:26 PM        2209284 python36.zip
-a----         3/4/2017   7:26 PM             79 python36._pth
-a----         3/4/2017   7:26 PM          96416 pythonw.exe
-a----         3/4/2017   7:26 PM          23200 select.pyd
-a----         3/4/2017   7:26 PM         866464 sqlite3.dll
-a----         3/4/2017   7:26 PM         895648 unicodedata.pyd
-a----         3/4/2017   7:26 PM          83784 vcruntime140.dll
-a----         3/4/2017   7:26 PM          24224 winsound.pyd
-a----         3/4/2017   7:26 PM          45216 _asyncio.pyd
-a----         3/4/2017   7:26 PM          77984 _bz2.pyd
-a----         3/4/2017   7:26 PM         101536 _ctypes.pyd
-a----         3/4/2017   7:26 PM         215712 _decimal.pyd
-a----         3/4/2017   7:26 PM         156832 _elementtree.pyd
-a----         3/4/2017   7:26 PM        1042592 _hashlib.pyd
-a----         3/4/2017   7:26 PM         183456 _lzma.pyd
-a----         3/4/2017   7:26 PM          32416 _msi.pyd
-a----         3/4/2017   7:26 PM          25760 _multiprocessing.pyd
-a----         3/4/2017   7:26 PM          33952 _overlapped.pyd
-a----         3/4/2017   7:26 PM          61600 _socket.pyd
-a----         3/4/2017   7:26 PM          64160 _sqlite3.pyd
-a----         3/4/2017   7:26 PM        1458848 _ssl.pyd

【问题讨论】:

get-pip 能够安装 pip,即使没有安装 pip。你确定你是在嵌入式 python 的上下文中运行的吗?你能显示运行 python 可执行文件的“WHERE”吗? @nir0s 你是指哪里?我从使用 zip 文件解压缩的文件夹中运行它。 这就是我要问的。哪个文件夹?你能打印那个文件夹的目录内容吗? @nir0s 我已经用文件夹内容更新了帖子。 相关:Adding packages to Python “embedded” installation for Windows 【参考方案1】:

我最近遇到了同样的问题。我检查了 pip 的文档,他们似乎说不支持这个用例等。但无论如何,这是我让模块工作的技巧。

我安装了,我的意思是将嵌入式 python 解压缩到一个名为 d:\python 的目录中。我假设这些模块将存在于同一个目录中。

首先,要安装 pip 模块,我需要保存提取的文件。我使用支持 unix 行终止符的文本编辑器更改了 get-pip.py,方法是删除 rmtree 行,这些行从 get-pip.py 文件中包含的 blob 中删除临时和解压缩树。

我更改了两个位置,但只需要最后一个。我在两个位置更改的行为

shutil.rmtree(tmpdir, ignore_errors=True)

我因此对其进行了修改(我不想打扰 python 缩进块):

print('shutil.rmtree(tmpdir, ignore_errors=True)')

我现在在修改后的 get-pip.py 上运行我的 python D:\python\python.exe 并找到文件解压缩到的临时目录。

我将此目录(检查它是否包含 ma​​in.py)文件复制到 python 安装 D:\python\pip(这是我希望我的模块所在的位置),确保D:\python\pip 目录包含 ma​​in.py 文件。

pip 模块现在安装在 python 目录中,但您需要进一步破解 pip 以删除上述异常。我通过更改 locations.py 文件(在我的情况下位于 D:\python\pip\locations.py)来返回 D:\python 的 bin_py 和 bin_user 位置。

即:

86 if WINDOWS:
....
bin_py = 'd:/python'
bin_user = 'd:/python'

我不得不将 pip 的 user_dir 更改为可以保留在该驱动器上的某个位置,该驱动器在多个 VM 之间共享。

pip 模块现在运行良好,例如

d:\python\python.exe -m pip ...

【讨论】:

这项工作很好,谢谢,但如果我安装 3-d 端包,它会将其放入 d:\python\Lib\site-packages 并且看不到 您可能需要检查站点路径。 我无法找到如何永久添加到路径 'd:\python\Lib\site-packages' 中,否则每次我使用嵌入式 python 时都会添加此路径 您不需要对位置进行硬编码,而是使用bin_py = os.path.dirname(sys.executable)bin_user = os.path.dirname(sys.executable)【参考方案2】:

即使明确指出可嵌入version of Python does not support Pip,也可以小心谨慎。您需要:

    下载并解压 Python embeddable zip 文件。

    在文件python39._pth 或类似文件中,取消注释import 命令。 结果应该类似于:

    python39.zip
    .
    import site
    

    Download get-pip.py 到 Python 安装文件夹

    运行get-pip.py。这会将 Pip 安装到 Scripts 目录中:

    python get-pip.py
    

    直接从命令行运行 Pip,因为 Pip 是一个可执行程序(这个 例如安装 Pandas):

    .\Scripts\pip install pandas
    

您可以在Pip issue 4207 中找到更多相关信息

【讨论】:

pip 安装正常,但随后将无法正常运行或根本无法运行。 “_pth”文件需要修改:在“.”下方添加“.\Lib\site-packages\” 我刚刚发现删除/重命名“_pth”文件可以将此安装从嵌入式中解放出来。带有“_pth”文件的python将无法识别任何其他环境变量,尤其是PYTHONPATH。 @YılmazDurmaz 很晚了...但是您是否遇到过删除 python36._pth 的任何负面后果?刚做了这个,它就像一个魅力......但感觉好得令人难以置信。 "._pth" 与在受限环境中运行安装有关。删除它可以释放,但仍然存在问题,因为我们只有库的“.pyc”文件,而不是源文件。因此,例如在 IDE 中不会有代码完成。 @RTbecard 你应该在安装 pip 后不注释 "import site",它会让 "\lib\site-packages" in sys.path @rnso【参考方案3】:

Pip 也可以在 python 中作为命令以编程方式访问(此示例安装 pandas):

import pip
pip.main(['install'], 'pandas')

(来源:Installing python module within code)

【讨论】:

我试过这种方法。然而,它产生了一个调用 python 的子进程,并且因为 setuptools 不在 python 路径上,所以它失败了。所以可能最好采用其他方法之一【参考方案4】:

我如何将 pip 安装到可嵌入的 python 发行版中:

    解压 python 可嵌入发行版存档并 cd 到那里 运行python ./get-pip.py(得到here) EITHER 只需在文件 pythonXX._pth 中取消注释字符串 import site 将文件夹(至少 pip)从新创建的文件夹 Lib/site-packages/ 复制到 pythonXX.zip

现在可以python -m pip ...

【讨论】:

在 Win 上使用 python38-64:pip 无法安装任何软件包。错误消息:import distlib ModuleNotFoundError: No module named 'distlib'distlib 可以是另一个包。【参考方案5】:

我的解决方案是删除此文件:

python39._pth

这允许 Pip 工作,也允许来自同一目录的import。 或者你可以得到这个:

https://nuget.org/packages/python

点击“下载包”,就可以解压成Zip文件了。

【讨论】:

这很好用!也许这应该是公认的答案。谢谢。【参考方案6】:

下载https://www.python.org/ftp/python/3.10.1/python-3.10.1-amd64.exe 并将其安装到虚拟盒子中

下载https://www.python.org/ftp/python/3.10.1/python-3.10.1-embed-amd64.zip 并解压到 python-3.10.1-embed-amd64

将“include”和“libs”目录从对应的python安装“python-3.10.1-amd64.exe”从Virtual Box复制到python-3.10.1-embed-amd64

转到 python-3.10.1-embed-amd64 文件夹和:

下载get-pip.py:
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
执行get-pip.py:
python get-pip.py
重命名_pth:
rename python310._pth python310._pth.renamed

设置环境:

set PY_PIP=python-3.10.1-embed-amd64\Scripts
set PY_LIBS=python-3.10.1-embed-amd64\Lib;python-3.10.1-embed-amd64\Lib\site-packages

现在“python -m pip install PACKETNAME”应该可以工作了。 PACKETNAME 在以下位置进行测试:

pywin32==302 psutil==5.8.0 pprofile==2.1.0 mypy==0.910 枕头==8.4.0 分数==1.4.0 pyyaml==6.0 人性化==3.13.1

注意:需要编译 C/C++ 的数据包安装也可以。

注意:“python-3.10.1-embed-amd64”的意思类似于 c:\mypythons\python-3.10.1-embed-amd64

【讨论】:

以上是关于带有嵌入式 python 的 pip的主要内容,如果未能解决你的问题,请参考以下文章

没有pip的嵌入式Python手动安装包

Python 可嵌入 zip:安装 Tkinter

使用带有嵌入式 PyPy 的外部“Python”样式 cffi 回调

在没有 pip/pip3 的情况下安装诸如“Web3”之类的 python 模块?

pip安装sqlite3

Python:解析带有嵌入图像的电子邮件