参考:https://www.cnblogs.com/mywolrd/p/4756005.html
在TX2嵌入式上用python开发时,为了隐藏python源码,或者说交付客户时减少操作,避免重复安装一堆依赖库,需要将源码打包为可执行文件,查看了好几种方式,用得比较广的是pyinstaller。
PyInstaller其实就是把python解析器和你自己的脚本打包成一个可执行的文件,和编译成真正的机器码完全是两回事,所以千万不要指望成打包成一个可执行文件会提高运行效率,相反可能会降低运行效率,好处就是在运行者的机器上不用安装python和你的脚本依赖的库。在Linux操作系统下,它主要用的binutil
工具包里面的ldd
和objdump
命令。
PyInstaller输入你指定的的脚本,首先分析脚本所依赖的其他脚本,然后去查找,复制,把所有相关的脚本收集起来,包括Python解析器,然后把这些文件放在一个目录下,或者打包进一个可执行文件里面。
可以直接发布输出的整个文件夹里面的文件,或者生成的可执行文件。你只需要告诉用户,你的应用App是自我包含的,不需要安装其他包,或某个版本的Python,就可以直接运行了。
需要注意的是,PyInstaller打包的执行文件,只能在和打包机器系统同样的环境下。也就是说,不具备可移植性,若需要在不同系统上运行,就必须针对该平台进行打包。
pip直接安装可能会有问题(源的问题),因此推荐使用源码安装。
下载源码并解压,cd进目录,运行以下代码即可
python setup.py install
安装完之后,可输入pyinstaller --version来查看是否成功
安装成功后,就可以使用下面的命令了:
pyinstaller
: 打包可执行文件的主要命令,详细用法下面会介绍。pyi-archive_viewer
: 查看可执行包里面的文件列表。pyi-bindepend
: 查看可执行文件依赖的动态库(.so或.dll文件)pyi-...
: 等等。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)对于复杂的工程,比如会调用第三方的库,这样生成可能会导致无法运行
因此,建议选用第一种方式,将所有的动态链接库都显示出来,如果在运行可执行文件的时候提示缺少库,可以从其它地方复制过来,也可以运行起来,而且如果程序有更新,只需要替换可执行文件即可,里边的动态链接库都不需要动
上边将要执行的代码打包为可执行文件了,接下来要做的是让TX2开机是自动运行这个可执行文件
关于TX2开机自运行程序,我在《NVIDIA TX2设置开机自启动程序》有过介绍,只需要在command中选择刚才生成的可执行文件即可,这里就不再赘述。