TX2之pyinstaller打包python脚本并自动运行

参考:https://www.cnblogs.com/mywolrd/p/4756005.html

0 背景

在TX2嵌入式上用python开发时,为了隐藏python源码,或者说交付客户时减少操作,避免重复安装一堆依赖库,需要将源码打包为可执行文件,查看了好几种方式,用得比较广的是pyinstaller。

PyInstaller其实就是把python解析器和你自己的脚本打包成一个可执行的文件,和编译成真正的机器码完全是两回事,所以千万不要指望成打包成一个可执行文件会提高运行效率,相反可能会降低运行效率,好处就是在运行者的机器上不用安装python和你的脚本依赖的库。在Linux操作系统下,它主要用的binutil工具包里面的lddobjdump命令。

PyInstaller输入你指定的的脚本,首先分析脚本所依赖的其他脚本,然后去查找,复制,把所有相关的脚本收集起来,包括Python解析器,然后把这些文件放在一个目录下,或者打包进一个可执行文件里面。

可以直接发布输出的整个文件夹里面的文件,或者生成的可执行文件。你只需要告诉用户,你的应用App是自我包含的,不需要安装其他包,或某个版本的Python,就可以直接运行了。

需要注意的是,PyInstaller打包的执行文件,只能在和打包机器系统同样的环境下。也就是说,不具备可移植性,若需要在不同系统上运行,就必须针对该平台进行打包。

1 安装

pip直接安装可能会有问题(源的问题),因此推荐使用源码安装。

下载源码并解压,cd进目录,运行以下代码即可

python setup.py install

安装完之后,可输入pyinstaller --version来查看是否成功 

安装成功后,就可以使用下面的命令了:

  • pyinstaller : 打包可执行文件的主要命令,详细用法下面会介绍。
  • pyi-archive_viewer : 查看可执行包里面的文件列表。
  • pyi-bindepend : 查看可执行文件依赖的动态库(.so或.dll文件)
  • pyi-... : 等等。

2 打包代码

pyinstaller的运行格式如下

pyinstaller [options] script [script ...] | specfile

其中:

script为要打包的python脚本

specfile为打包时的配置文件,这个文件会默认生成,也可以手动修改配置

比如新建一个test.py文件,里边只有一句简单的print语句

print("This is a test")

然后在该目录中运行如下指令

pyinstaller test.py

会在目录中生成build文件夹和dist文件夹,dist文件夹下就是能发布的可执行文件,里边包含了各种动态库文件,在终端中打开dist/test文件夹,运行如下指令

./test

可以正常输出脚本中的结果

当然,如果你的脚本很简单,没有太多的依赖关系,生成可执行文件的时候,可以把所有的动态库文件和可执行文件全部打包为一个文件,这样在发布的时候就可以避免动态库丢失造成运行失败,只需要加一个参数-F即可,如下

pyinstaller -F test.py

这个时候再打开dist文件夹可看到里边只有一个test可执行文件,但这样做有几个缺点:

(1)可执行文件变大,运行时速度会变慢

(2)对于复杂的工程,比如会调用第三方的库,这样生成可能会导致无法运行

因此,建议选用第一种方式,将所有的动态链接库都显示出来,如果在运行可执行文件的时候提示缺少库,可以从其它地方复制过来,也可以运行起来,而且如果程序有更新,只需要替换可执行文件即可,里边的动态链接库都不需要动

3 开机自启动

上边将要执行的代码打包为可执行文件了,接下来要做的是让TX2开机是自动运行这个可执行文件

关于TX2开机自运行程序,我在《NVIDIA TX2设置开机自启动程序》有过介绍,只需要在command中选择刚才生成的可执行文件即可,这里就不再赘述。

你可能感兴趣的:(TX2,Python)