在日常的数据库运维管理中,经常要写一大堆的Python脚本,那么如何将Python脚本打包成可执行的程序,本文就针对该需求将Python脚本打包成Linux可执行文件,具体步骤如下:
环境说明
OS:CentOS 7
Python:2.7
1、安装pyinstaller
使用的工具是pyinstaller,打开终端输入sudo pip install pyinstaller
# pip install pyinstaller Collecting pyinstaller Downloading https://pypi.srvxxx/packages/cf/b0/69585629b023056e801a99ee4d669e2d3b85fb5a68fe461c1660af9ea514/pyinstaller-5.0.tar.gz (2.8MB) 100% |████████████████████████████████| 2.8MB 455kB/s Complete output from command python setup.py egg_info: Traceback (most recent call last): File "", line 1, in File "/tmp/pip-build-oLQxj4/pyinstaller/setup.py", line 73 file=sys.stderr ^ SyntaxError: invalid syntax ---------------------------------------- Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-oLQxj4/pyinstaller/
python2.7直接安装pyinstaller会报错,版本5与python2不兼容,所以我们安装时需指定兼容的pyinstaller版本号。安装命令如下:
# pip2 install pyinstaller==3.2.1 Collecting pyinstaller==3.2.1 Downloading https://pypi.srv.xxx/packages/3f/d2/3515242cc5cfed12706506d17728a7ee0b8cf33840e250357fd793a94607/PyInstaller-3.2.1.tar.bz2 (2.4MB) 100% |████████████████████████████████| 2.4MB 500kB/s Requirement already satisfied (use --upgrade to upgrade): setuptools in /usr/lib/python2.7/site-packages (from pyinstaller==3.2.1) Installing collected packages: pyinstaller Running setup.py install for pyinstaller ... done Successfully installed pyinstaller-3.2.1
安装完成后,输入pyinstaller测试是否成功。
# pyinstaller usage: pyinstaller [-h] [-v] [-D] [-F] [--specpath DIR] [-n NAME] [--add-data <SRC;DEST or SRC:DEST>] [--add-binary <SRC;DEST or SRC:DEST>] [-p DIR] [--hidden-import MODULENAME] [--additional-hooks-dir HOOKSPATH] [--runtime-hook RUNTIME_HOOKS] [--exclude-module EXCLUDES] [--key KEY] [-d] [-s] [--noupx] [-c] [-w] [-i ] [--version-file FILE] [-m ] [-r RESOURCE] [--uac-admin] [--uac-uiaccess] [--win-private-assemblies] [--win-no-prefer-redirects] [--osx-bundle-identifier BUNDLE_IDENTIFIER] [--distpath DIR] [--workpath WORKPATH] [-y] [--upx-dir UPX_DIR] [-a] [--clean] [--log-level LEVEL] [--upx UPX] scriptname [scriptname ...] pyinstaller: error: too few arguments
2、打包程序
首先在打包之前检查一下py文件是否可以正常执行,确认无误后进行打包
# pyinstaller -F test.py 35 INFO: PyInstaller: 3.2.1 36 INFO: <a href="http://www.seiang.com/?tag=python" title="查看更多关于Python的文章" target="_blank">Python</a>: 2.7.5 36 INFO: Platform: Linux-3.10.0-1127.19.1.el7.x86_64-x86_64-with-centos-7.8.2003-Core 36 INFO: wrote /root/test/test.spec 51 INFO: UPX is not available. 52 INFO: Extending PYTHONPATH with paths ['/root/test', '/root/test'] 53 INFO: checking Analysis 53 INFO: Building Analysis because out00-Analysis.toc is non existent 53 INFO: Initializing module dependency graph... 55 INFO: Initializing module graph hooks... 99 INFO: running Analysis out00-Analysis.toc 117 INFO: Caching module hooks... 119 INFO: Analyzing /root/test/test.py 1315 INFO: Processing pre-safe import module hook six.moves 1744 INFO: Processing pre-safe import module hook _xmlplus 2604 INFO: Loading module hooks... 2604 INFO: Loading module hook "hook-xml.py"... 2643 INFO: Loading module hook "hook-httplib.py"... 2643 INFO: Loading module hook "hook-requests.py"... 2645 INFO: Loading module hook "hook-encodings.py"... 3049 INFO: Looking for ctypes DLLs 3202 INFO: Analyzing run-time hooks ... 3211 INFO: Looking for dynamic libraries 3627 INFO: Looking for eggs 3627 INFO: Using <a href="http://www.seiang.com/?tag=python" title="查看更多关于Python的文章" target="_blank">Python</a> library /lib64/libpython2.7.so.1.0 3631 INFO: Warnings written to /root/test/build/test/warntest.txt 3688 INFO: checking PYZ 3688 INFO: Building PYZ because out00-PYZ.toc is non existent 3688 INFO: Building PYZ (ZlibArchive) /root/test/build/test/out00-PYZ.pyz 4020 INFO: Building PYZ (ZlibArchive) /root/test/build/test/out00-PYZ.pyz completed successfully. 4067 INFO: checking PKG 4067 INFO: Building PKG because out00-PKG.toc is non existent 4067 INFO: Building PKG (CArchive) out00-PKG.pkg 6421 INFO: Building PKG (CArchive) out00-PKG.pkg completed successfully. 6430 INFO: Bootloader /usr/lib/python2.7/site-packages/PyInstaller/bootloader/Linux-64bit/run 6430 INFO: checking EXE 6430 INFO: Building EXE because out00-EXE.toc is non existent 6430 INFO: Building EXE from out00-EXE.toc 6431 INFO: Appending archive to ELF section in EXE /root/test/dist/test 6462 INFO: Building EXE from out00-EXE.toc completed successfully.
打包成功后,目录如下:
# ll total 8 drwxr-xr-x 3 root root 18 Apr 22 16:00 build drwxr-xr-x 2 root root 18 Apr 22 16:00 dist -rw-r--r-- 1 root root 3130 Apr 22 15:51 test.py -rw-r--r-- 1 root root 673 Apr 22 16:00 test.spec
会在dist目录下生成一个可执行的文件
# ll total 4764 -rwxr-xr-x 1 root root 4876696 Apr 22 16:31 test # ./test --list -u xh -g xx Please enter your passwd:1234 测试成功了
到此,一个python脚本就打包成了一个可执行的文件了,无论将可执行文件放到任何路径下都可以执行了