作者:别被风景迷了眼 | 来源:互联网 | 2023-09-17 18:53
线上服务器的系统基本都是centos6.x,python版本是2.7.5。仅仅是为字符的问题处理上,应该使用python3.x,而不是python2。所以用pyinstaller打
线上服务器的系统基本都是centos 6.x,python 版本是 2.7.5。仅仅是为字符的问题处理上,应该使用python3.x,而不是python2。所以用 pyinstaller 打包 python 3.x 运行的脚本,而不用在线上安装依赖的环境。
wget 下载源码,configure ;make ;make install 三部曲安装。
wget https://www.python.org/ftp/python/3.4.0/Python-3.4.0.tgz
tar -zxvf Python-3.4.0.tgz
cd Python-3.4.0
./configure
make
make install
安装完之后,包管理器 pip3 也有了。如果没有,下载pip的源码使用 python3 setup.py install 来安装。使用 pip3 或者源码来安装 pyinstaller.
使用 pyinstaller 将所有依赖打包到一个文件当中(如果提示 pyinstaller 命令不存在的,需要处理一下环境变量):
pyinstaller --console --onefile script.py
结果报错:
* On Debian/Ubuntu, you would need to install Python development packages
* apt-get install python3-dev
* apt-get install python-dev
* If you're building Python by yourself, please rebuild your Python with `--enable-shared` (or, `--enable-framework` on Darwin)
重新编译安装,按提示带上参数来生成makefile,然后再make;make install安装。
./configure --enable-shared
编译安装完毕,运行 python3,提示 error while loading shared libraries:
运行时链接动态库失败,编译时安装该动态库在 (find /usr -name 'libpython3.6m.so.1.0' 搜一下)
/usr/local/lib
目录下。该路径不在连链接器默认的动态库搜索范围里,可以 ldconfig -v | grep python 看不到该动态库。
若该库不在链接器的搜索范围内,执行 ldd $(which python3) 可查看到该库指向为 not found.
linux-vdso.so.1 => (0x00007ffd609e2000)
libpython3.4m.so.1.0 => not found
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6e934cf000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f6e932ca000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f6e930c7000)
libm.so.6 => /lib64/libm.so.6 (0x00007f6e92e43000)
libc.so.6 => /lib64/libc.so.6 (0x00007f6e92aae000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6e93ba2000)
ldconfig 命令用来管理链接器的动态库搜索路径,默认的是 /lib 和 /usr/lib 已经 /etc/ld.so.conf 配置文件中包含的目录,将 /usr/local/lib 添加到 /etc/ld.so.conf 当中,执行
ldconfig
刷新一下缓存。
此时再运行 python3,使用 pyinstaller 打包也都正常。
另外,使用 ldconfig 来修改系统的动态库的搜索路径,还有一个临时的替代方法就是修改预定义变量:LD_LIBRARY_PATH,然后 export 使得子进程当中能够使用。