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 参数效果是一样的。

五、参考资料

文章评论

0条评论