Python3打包脚本和配置文件,生成单个可执行程序
- 环境:CentOS 7.9
- Python 环境:Python 3.9.5
Python 脚本经常由于环境变化、依赖包没装、Python 版本不同等原因,在不同的机器上无法正常运行。pyinstaller 工具提供了方法把 Python 脚本、依赖包以及执行环境打包,甚至生成一个单独的可执行程序,让该程序可以在其他主机上正常运行,而不必关心其有没有安装 Python 环境及其依赖包。
下面简单介绍 pyinstaller 的使用。
一、编译 Python 环境
Python 环境最好自己源码编译,选用 Python3 高版本,编译时加上编译参数 --enable-shared 参考如下步骤:
wget https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tgz tar zxvf Python-3.9.1.tgz cd Python-3.9.1 ./configure --enable-shared --prefix=/usr/local/python3 make make install
二、安装 pyinstaller
cd /usr/local/python3/bin/ ./pip3 install pyinstaller ./pip3 install --upgrade pyinstaller
三、打包 Python 脚本
./pyinstaller /opt/src/main.py -F
-F 参数是打包成一个可执行文件,不加 -F 则生成一个目录,里面包含可执行文件以及依赖的动态库。 执行成功后,会在当前目录下生成一个 build 和 dist 的目录,其中 dist 目录里面就是生成的可执行程序。
四、打包配置文件
如果想把配置文件也打包到可执行文件中,则可以指定 --add-data 参数实现,示例如下:
./pyinstaller --add-data /opt/config1.yaml:./ --add-data /opt/config2.yaml:./ /opt/main.py -F
--add-data 参数的格式是 src:des,src 指定源文件路径,des 是打包后的路径。
如果 Python 脚本要读配置文件,则最好使用绝对路径方式,如下:
with open(os.path.dirname(os.path.abspath(__file__)) + "/config1.yaml", 'r', encoding='utf-8') as config: file_data = config.read() item_dict = yaml.safe_load(file_data)
除了指定 --add-data 参数外,也可以手动修改 spec 文件,pyinstaller 执行之后,会在当前目录生成一个 main.spec, main 是 python 脚本的名称,手动修改该文件,在 datas 部分加入配置文件,如下: 修改main.spec
datas=[('/opt/config1.yaml','.'),('/opt/config2.yaml','.')]
然后重新打包:
./pyinstaller main.spec
这种方式与直接指定 --add-data 参数效果是一样的。
文章评论