带有嵌入式 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 并找到文件解压缩到的临时目录。
我将此目录(检查它是否包含 main.py)文件复制到 python 安装 D:\python\pip(这是我希望我的模块所在的位置),确保D:\python\pip 目录包含 main.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的主要内容,如果未能解决你的问题,请参考以下文章
使用带有嵌入式 PyPy 的外部“Python”样式 cffi 回调