【发布时间】:2020-09-27 21:10:50
【问题描述】:
我有一个要作为独立应用程序分发的模块。模块结构如下:
$ tree -L 2 ./
./
├── mymodule
│ ├── __main__.py
│ ├── fun.py
└── mymodule.pyz
mymodule/__main__.py 包含下一行:
#!/usr/bin/env python
import argparse
import sys
import os.path
from mymodule.fun import Fun
def main():
sys.stdout.write('main is running')
Fun().run()
if __name__ == '__main__':
main()
mymodule/fun.py 包含下一行:
#!/usr/bin/env python
import sys
class Fun:
"""FUN"""
def __init__(self):
pass
def run(self):
sys.stdout.write("fun")
如果我使用$ python -m mymodule 运行模块,则输出为
main is runningfun
但是如果我使用 $ python -m zipapp -p "/usr/bin/evn python" mymodule 创建一个独立的应用程序并运行它 $ python mymodule.pyz 我得到了错误
Traceback (most recent call last):
File "/Users/igork/.pyenv/versions/3.6.4/lib/python3.6/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/Users/igork/.pyenv/versions/3.6.4/lib/python3.6/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "mymodule.pyz/__main__.py", line 6, in <module>
ModuleNotFoundError: No module named 'mymodule'
import 有什么问题?
更新: sys.path 输出
$ python -m mymodule
['', '/Users/igork/.pyenv/versions/3.6.4/lib/python36.zip', '/Users/igork/.pyenv/versions/3.6.4/lib/python3.6', '/Users/igork/.pyenv/versions/3.6.4/lib/python3.6/lib-dynload', '/Users/igork/.local/lib/python3.6/site-packages', '/Users/igork/.pyenv/versions/3.6.4/lib/python3.6/site-packages']
$ python mymodule.pyz
['mymodule.pyz', '/Users/igork/.pyenv/versions/3.6.4/lib/python36.zip', '/Users/igork/.pyenv/versions/3.6.4/lib/python3.6', '/Users/igork/.pyenv/versions/3.6.4/lib/python3.6/lib-dynload', '/Users/igork/.local/lib/python3.6/site-packages', '/Users/igork/.pyenv/versions/3.6.4/lib/python3.6/site-packages']
【问题讨论】:
-
我对 zipapp 不熟悉,但是您是否尝试过使用相对导入?即
from .fun import Fun -
@Jasmijn 可能有一些东西。这一切都归结为“你的
sys.path的价值是多少?”。我敢打赌,这两种环境的价值是不同的。我建议你在你的程序中添加一个print(sys.path)(如果你还没有添加import sys),看看我是否真的是对的。如果是这样,那么您可能想要做的只是在不工作的模式下附加到sys.path1上,而在工作模式下sys.path1中缺少任何内容。
标签: python python-import zipapp