如何用PyInstaller将调用本地bash脚本的Python脚本打包为独立可执行文件
问题
需要将调用本地bash脚本的Python脚本通过PyInstaller打包为单可执行文件,实现不依赖外部脚本的独立运行。
项目结构:
Project/ |-- bash_script/ | |-- script.sh |-- main.py
main.py中调用脚本的代码:
output = subprocess.check_output('./bash_script/script.sh', shell=True).decode()
使用以下命令打包后,在dist目录运行可执行文件时出现错误:
pyinstaller --add-data "./bash_script/script.sh:." --onefile main.py
错误信息:
/bin/sh: 1: ./bash_script/script.sh: not found
解决方法
问题根源在于PyInstaller的--onefile模式会把所有打包资源解压到系统临时目录,而非当前运行目录,原代码的相对路径无法定位到脚本。按以下步骤修改即可解决:
1. 调整打包命令
保持bash脚本的原目录结构打包,确保解压后路径与开发环境一致:
pyinstaller --add-data "./bash_script/script.sh:bash_script" --onefile main.py
2. 修改main.py代码
更新脚本路径的获取逻辑,适配打包后的运行环境,同时给脚本添加执行权限:
import subprocess import os import sys def get_script_path(): # 判断是否处于PyInstaller打包后的运行环境 if hasattr(sys, '_MEIPASS'): # 打包后临时解压目录下的脚本路径 return os.path.join(sys._MEIPASS, 'bash_script', 'script.sh') # 开发环境下的原路径 return './bash_script/script.sh' script_path = get_script_path() # 给脚本添加可执行权限 os.chmod(script_path, 0o755) # 调用脚本并输出结果 output = subprocess.check_output(script_path, shell=True).decode() print(output)
修改完成后,重新打包生成的单可执行文件即可在任意路径下独立运行,无需依赖外部bash脚本。
内容的提问来源于stack exchange,提问作者Chopin
相关产品推荐
相关产品推荐

