编译python脚本为单文件可执行文件(python3)
环境概况
1 | 系统:CentOS Linux release 7.5 |
安装pyinstaller
pip install pyinstaller pyinstaller --onefile testCsv.py #编译好的文件在dist目录下
激动的开始做成可执行单文件,这是什么鬼…
1 | [root@magicYou signal]# pyinstaller --onefile testCsv.py |
按照一贯做法,百度谷歌一波
尝试解决方案一:
搜来的原话是这样说的
1 | 大概意思就是pyinstaller报错找不到python动态库,也提示说升级python-dev。因为我是centos,各种yum install python-devel和yum install python-dev都不行,什么升级/重装python、sudo、su甚至重装系统都不行!!!我又必须在centos6.2环境下编译,如果我在其他高版本的环境下打包后拿到centos6.2就会报错,言归正传!其实处理起来很简单。只需要复制python安装目录下的动态库到系统地动态库目录即可。 |
我的是python3.6,要不就试试呗。
看了一下,python安装位置,没毛病,
1 | cp -R /usr/local/python3.6/lib/* /usr/lib64/ |
再次生成可执行单文件,依然报错,问题一样,接着找解决办法
尝试解决方案二:
仔细看报错的信息,有这么一段很醒目:
1 | SError: Python library not found: libpython3.6.so.1.0, libpython3.6mu.so.1.0, libpython3.6m.so.1.0 |
是在说我缺少了某个东西,让我安装python3-dev云云的。深入了解一下
1 | linux发行版通常会把类库的头文件和相关的pkg-config分拆成一个单独的xxx-dev(el)包. //pkg=package,包裹 |
后再来找一一个靠谱的回答
原话是这样说的:
1 | You must install python-dev for your python's version |
各个python版本对应的python-dev版本,推测我的是python36-devel,动手试试
1 | [root@magicYou signal]# yum install python36-devel |
再次尝试pyinstaller生成可执行单文件
1 | root@magicYou signal]# pyinstaller --onefile testCsv.py |
问题解决,很棒很棒!
续集
后来又在centos6.8,发现上述办法不能解决这个问题
Centos6.8上如下
1 | [root@magicYou /]# yum install python36-devel |
后来又在centos7.2 上看了一下:
1 | [root@VM_0_12_centos ~]# yum install python36-devel |
为啥不一样呢,依然解决不了问题。后来在一个角落找到一个靠谱的,如下:
1 | I have solved this in the way below: |
比葫芦画瓢,find一下,还真找到了
1 | find / -name libpython3.6mu.so.1.0 |
1 | cp /folder/to/your/libpython3.6mu.so.1.0 /usr/lib |
再次解决问题,十分坎坷
总结:
- pyinstaller的问题在不同的系统上都不一样;
- 还有一个比较严重的问题就是在高版本的centos上生成的可执行单文件在低版本上可能无法运行,我自己的第一个虚拟机是centos7.2费了老劲搞好环境生成单文件放在生产环境centos6.8报错,查找问题是说一个系统的库版本太高导致;