如何将zipapp打包的Python归档包以模块方式运行?
解决zipapp打包后相对导入失败的问题
问题场景
目录结构:
app_builder/ __init__.py __main__.py server.py
__main__.py中使用了相对导入:
from .server import app
用zipapp打包命令:
python -m zipapp app_builder
直接运行打包后的文件时报错:
python app_builder.pyz
ImportError: attempted relative import with no known parent package
但以模块方式运行则正常:
python -m app_builder
解决方案
方法1:打包时指定模块入口(推荐)
打包时通过-m参数指定包的__main__模块作为入口,让Python以包模式加载归档内的代码,和python -m的运行逻辑完全一致:
python -m zipapp app_builder -m "app_builder.__main__"
之后直接运行python app_builder.pyz即可正常执行,相对导入不再报错。
方法2:修改__main__.py兼容两种运行方式
如果无法调整打包命令,可以修改__main__.py的导入逻辑,同时支持脚本模式和模块模式:
import sys from pathlib import Path if __package__ is None: # 作为独立脚本运行时,将当前目录加入模块搜索路径 sys.path.insert(0, str(Path(__file__).parent)) from server import app else: # 作为包模块运行时,使用相对导入 from .server import app # 这里添加业务执行代码,比如启动服务 # app.run()
内容的提问来源于stack exchange,提问作者Max Koretskyi
相关产品推荐
相关产品推荐

