首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有zipapp和编译的C代码的ModuleNotFound异常

带有zipapp和编译的C代码的ModuleNotFound异常
EN

Stack Overflow用户
提问于 2022-07-19 17:06:12
回答 1查看 108关注 0票数 1

我遇到了使用Python的zipapp特性的奇怪行为。

Python版本: 3.10.5

代码语言:javascript
复制
# 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

代码语言:javascript
复制
$ 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
代码语言:javascript
复制
$ 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存档中解决这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-19 20:20:24

这是Python的导入机制强加的限制。Python有各种导入钩子:

代码语言:javascript
复制
>>> 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年版,.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73040963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档