如何判断Python脚本是否运行在zipapp包中?
优雅判断Python脚本是否以zipapp形式运行
针对你遇到的zipapp打包后__file__变量变化导致逻辑失效的问题,这里提供几个比检查__file__ + "z"更可靠的方案:
方案1:直接判断文件后缀
zipapp打包后的文件默认使用.pyz后缀,直接检查__file__的扩展名即可:
import os is_zipapp = os.path.splitext(__file__)[1] == ".pyz"
这个方案简单高效,适合大多数常规场景。
方案2:检查文件是否为Zip归档格式
zipapp本质是标准Zip文件,不管你有没有修改后缀名,都可以通过判断文件是否为Zip格式来确认:
import zipfile def is_running_from_zipapp(): try: return zipfile.is_zipfile(__file__) except (IOError, TypeError): # 处理文件无法读取或__file__非字符串的情况 return False
这个方案兼容性更强,哪怕你自定义了zipapp的后缀名也能正常工作。
方案3:检查模块的加载位置
当脚本以zipapp形式运行时,主模块的文件路径会指向Zip归档文件,你可以结合inspect模块验证这一点:
import inspect import zipfile def is_running_from_zipapp(): main_file = inspect.getfile(inspect.currentframe()) try: return zipfile.is_zipfile(main_file) except (IOError, TypeError): return False
这个方案适合需要更严谨验证的场景,避免__file__被意外修改的情况。
内容的提问来源于stack exchange,提问作者Anibal Jodorcovsky
相关产品推荐
相关产品推荐

