我遇到了使用Python的zipapp特性的奇怪行为。
Python版本: 3.10.5
# these steps come from the docs: https://docs.python.org/3/library/zipapp.html
$ mkdir myapp
# this is the library I'd like to use
$ echo "cysystemd==1.5.3" > requirements.txt
$ pip install -r requirements.txt --target myapp
# prepare the zipapp entry point, just import the library
$ echo "from cysystemd import journal" > myapp/__main__.py
# executing the directory works fine. the import takes place and the program terminates successfully.
$ python3 myapp/
# zipapping
$ python -m zipapp -p "python3" myapp
# now executing again, this time the zipapp:
$ ./myapp.pyz
Traceback (most recent call last):
File "/home/samba/.pyenv/versions/3.10.5/lib/python3.10/runpy.py", line 196, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/home/samba/.pyenv/versions/3.10.5/lib/python3.10/runpy.py", line 86, in _run_code
exec(code, run_globals)
File "/home/samba/git_wsl/zipapp_experiment/./myapp.pyz/__main__.py", line 1, in <module>
File "/home/samba/git_wsl/zipapp_experiment/./myapp.pyz/cysystemd/journal.py", line 7, in <module>
ModuleNotFoundError: No module named 'cysystemd._journal'我无法理解这个进口问题。_journal指的是编译后的C模块,它存在于两个位置,myapp目录以及zipapp myapp.pyz
$ find myapp/ | grep journal
myapp/cysystemd/journal.py
myapp/cysystemd/__pycache__/journal.cpython-310.pyc
myapp/cysystemd/_journal.cpython-310-x86_64-linux-gnu.so$ unzip -l myapp.pyz| grep journal
4880 2022-06-21 21:39 cysystemd/journal.py
301104 2022-07-19 18:47 cysystemd/_journal.cpython-310-x86_64-linux-gnu.so
5043 2022-07-19 18:47 cysystemd/__pycache__/journal.cpython-310.pyc有什么不对的地方吗?我怀疑一个与sys.path相关的问题,但我不知道如何在zipapp存档中解决这个问题。
发布于 2022-07-19 20:20:24
这是Python的导入机制强加的限制。Python有各种导入钩子:
>>> import sys
>>> sys.path_hooks
[zipimport.zipimporter,
<function _frozen_importlib_external.FileFinder.path_hook...]拉链说:
任何文件都可能出现在ZIP存档中,,但进口商只对.py和.pyc文件调用。动态模块(.pyd,.so)的ZIP导入是不允许的。
为了绕过那个空间中的限制工具(比如佩克斯,希夫,.)使用齐帕普方法,但是他们会在运行它之前提取zip文件,这样就避免了zip导入模块的限制。
请在这里查看如何在希夫工具中使用cysystemd:
PS。有相当多的包装选项;Python包装管理局有更多的信息;一些关于这个主题的讨论:“包装梯度”,PyBay2017,“打包Python应用程序”,PyCon巴尔干2018年版,.
https://stackoverflow.com/questions/73040963
复制相似问题