python to exe Acemyzoe

Linux的.a、.so和.o文件

更多见博客

windows下obj,lib,dll,exe的关系

lib是静态链接库的库文件,dll是动态链接库的库文件。

所谓静态就是link的时候把里面需要的东西抽取出来安排到你的exe文件中,以后运行你的exe的时候不再需要lib。

所谓动态就是exe运行的时候依赖于dll里面提供的功能,没有这个dll,你的exe无法运行。

obj里存的是编译后的代码跟数据,并且有名称,所以在连接时有时会出现未解决的外部符号的问题。当连成exe后便不存在名称的概念了,只有地址。lib就是一堆obj的组合。

静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。

linux .o,.a,.so

.o,是目标文件,相当于windows中的.obj文件 .so 为共享库,是shared object,用于动态连接的,相当于windows下的dll .a为静态库,是好多个.o合在一起,用于静态连接

Python to 可执行文件

pyinstaller(推荐)

pyinstaller

pip install pyinstaller
pyinstaller [opts] yourprogram.py 
	opts:
	-F  创建一个文件捆绑可执行文件。
	-c  打开用于标准I / O的控制台窗口(默认)。
	-w  Windows和Mac OS X:不提供标准I / O的控制台窗口。
	-i  <FILE.ico or FILE.exe,ID or FILE.icns>
		FILE.ico:将该图标应用于Windows可执行文件。
		FILE.exe,ID,从exe中提取具有ID的图标。
		FILE.icns:将图标应用于Mac OS X上的.app捆绑包

在arm架构的容器中安装pyinstaller时需要重新交叉编译引导程序

https://github.com/pyinstaller/pyinstaller/blob/develop/bootloader/Dockerfile

Nuitka

Nuitka
Nuitka直接将python编译成C++代码 ,再编译C++代码产生可执行文件,完全不存在反向解析的问题,非常安全,而且由于可执行文件由C++编译而来,文件大小很小,运行速度也会获得提升。

pip install -U nuitka

# 编译单个文件,linux下生成二进制可执行文件*.bin
nuitka ./hello.py
# 指定模块
nuitka --follow-import-to=MODULE/PACKAGE hello.py
# 嵌入所有模块的程编译 
nuitka --follow-imports program.py
# 编译某个目录的所有文件
nuitka ./hello.py  --include-plugin-directory=./
					--remove-output 
					--output-dir=./output 
					-o ./output/hello        

	--include-plugin-directory: 编译依赖的目录
	--remove-output: 移除编译输出的中间态文件,即自动删除build目录
	--output-dir: 指定输出信息的文件目录,默认为当前目录
	-o: 指定输出的文件名(需包含所在目录)
# 用来显示详细打包过程
	 --show-scons        Operate Scons in non-quiet mode, showing the executed
                        commands. Defaults to off.
    --show-progress     Provide progress information and statistics. Defaults
                        to off.
    --show-memory       Provide memory information and statistics. Defaults to
                        off.
    --show-modules      Provide a final summary on included modules. Defaults
                        to off.
    --verbose           Output details of actions taken, esp. in
                        optimizations. Can become a lot. Defaults to off.


###### 发布一个程序 ######
# 参数--standalone默认包含参数--follow-imports,即对所有的引用到的库都进行打包,将这些库中的py或者pyc打包进exe,然后再将所依赖的二进制文件(dll或者pyd)拷贝到exe所在文件夹。只要命令能够执行完成不出错,生成的exe就可以完全脱离python环境独立运行。
# 使用这个参数,编译太慢了!!!慎用
nuitka --standalone ./hello.py
# 参数plugin control
# 这部分参数用于设置对某些第三方库或者python功能进行支持,在使用--standalone时才会用到。
# 如果使用了这些库或功能,但是忘了进行插件参数设置,命令运行过程中会以红字今天提醒,按照提醒对命令进行调整
# 程序中使用了pyqt或者pyside,numpy, scipy, pandas, matplotlib
--plugin-enable=numpy   --plugin-enable=qt-plugins  --plugin-enable=tensorflow

py2exe

py2exe

cx_freeze

python -m pip install cx_Freeze --upgrade
cxfreeze-quickstart.exe	#快速构建setup.py
python setup.py build #生成exe
python setup.py bdist_msi #生成安装包

Python to Pyc

python的解释特性是将py编译为独有的二进制编码pyc文件,然后对pyc中的指令进行解释执行。pyc的反编译却非常简单,可直接反编译为源码。

pyc : 可跨平台、跨架构执行的字节码文件

python -m demo.py

python -m py_compile /path/to/{myApp1,myApp2,,...,}.py
#整体批量编译
python -m compileall myProjectDir
import py_compile
py_compile.compile('path/to/myApp.py') 

import compileall
compileall.compile_dir(dir='path/to/myProjectDir/',force=True)

Python to so

# 准备工作
pip install cython
apt-get install python-devel
apt-get install gcc

setup.py

from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules = cythonize(["hello1.py", "hello2.py","hello3.py"]))
# 打包
python setup.py build_ext

# 新建脚本导入hello模块,来源于hello.so文件中。