我正在构建一个python应用程序,不想强迫我的客户机安装python和模块。我还想使我的应用程序关闭源代码。
那么,有没有一种方法可以将Python脚本编译成独立的可执行文件呢?
- 没有使应用程序关闭源代码的安全选项,.pyc和.pyo文件并不难还原。
- @PolatAlemdar:"不是所有的Linux发行版都包括python"?真的?哪一个?你没有解释Windows安装程序出了什么问题?
- @s.lott:所有的puppy linux版本都在单独的壁球中与python一起提供,其中包含所有的开发工具。不过,我还是要提一下:我同意你的看法。
- @S.lott:实事求是。虽然python安装程序对于计算机专业人士来说是很好的,但是如果让奶奶在Windows上安装python,这样她就可以运行python配方文件管理器,那就太荒谬了。她放弃了python应用程序,转而使用一些封闭源代码和易于安装的软件。
- 问题的一部分说"我不想强迫我的客户安装python和模块。"它没有说客户不能这样做,它说开发人员不想要求他们这样做。在这里讨论这一点毫无意义,因为客户不是为了自己说话而阅读。我不想安装一个Flash开发环境来观看YouTube,或者安装一个C开发环境来玩数独,或者安装一个python开发环境来运行用python编写的愤怒的小鸟版本。这就是可再发行运行时的用途。
- python2还是python3?请在答案中添加python的兼容版本。
可以使用pyinstaller将python程序打包为独立的可执行文件。它适用于Windows、Linux和Mac。
PyInstaller Quickstart
Install PyInstaller from PyPI:
Go to your program’s directory and run:
1
| pyinstaller yourprogram.py |
This will generate the bundle in a subdirectory called dist.
For a more detailed walkthrough, see the manual.
- 值得注意的是,pyinstaller可以编译为单个.exe文件。同时,它运行在哪个操作系统上,使该可执行文件成为可执行文件,即在Windows上运行时的.exe文件。
- @他们正在支持python 3。请参见github.com/pyinstaller/pyinstaller/tree/python3。
- 正如@geenhenk所说,如果您在Windows上"编译"它会生成一个exe,请记住,您不能在Linux上为Windows编译(生成一个exe),也不能在Windows上生成一个Linux可执行文件。只能使正在运行的平台的可执行文件。(在Linux中,您可以使用葡萄酒来实现此目的)
- 使用"pyinstaller"比使用"py2exe"容易得多。它处理所有依赖项,包括numpy、pandas和任何东西,并在工作平台上为您提供单个可执行文件!
- 似乎正是我要找的。现在支持python 3!谢谢)
- 我都试过了,pyinstaller和其他人(py2exe、freeze、cython、python的嵌入式版本等)仍然无法处理python动态库本身的依赖关系,至少在windows(python.dll)中是如此。DLL依赖于运行时,必须单独安装。在该过程之后,您将获得链接到DLL的可执行文件,因此具有相同的可导入性。因此,您的"独立"可执行文件不是很独立,而是更像是可嵌入的。要解决运行时依赖关系,您必须使用cpython项目从源代码重新构建Python。
- "阿克斯"。我有一个python脚本。它使用的模块包括熊猫、matplotlib、time和tkfiledialog。它在Python平台中运行良好。当我尝试使用pyinstaller创建exe并运行应用程序时,使用pandas会显示错误。我不明白这个错误的原因。我使用的是python 2.7。
- 它确实生成了一个.exe文件,但当我尝试运行它时,出现以下错误:LoadLibrary:找不到指定的模块。
您可以使用已应答的py2exe,并使用cython转换您的密钥.py文件(在.pyc中)、c编译的文件(如在Windows中的.dll文件和在Linux中的.so文件),这比普通.pyo和.pyc文件更难还原(同时也提高了性能!)
- 谢谢你的回答。我已经考虑过cython,但它似乎仍然需要python来运行编译后的可执行文件。你的意思是用cython把脚本编译成.pyc吗?(我不知道赛通有没有这种功能)
- 我的意思是你有两个问题:封闭源代码和没有DEPS。对于封闭源代码,使用cython在C libs中编译重要代码。对于没有DEP,请使用py2exe,并使用内的.pyd(cython编译的)文件生成可执行文件。
- 你会怎么处理图书馆(numpy,scipy,matplotlib)?例如,客户机如何能够从可执行文件使用matplotlib中的ginput()函数,而无需在其计算机上安装它。
- @黑猩猩不知道静态链接呢?
- Py2Exe仅限于Windows,但是人们报告说,在Wine下的Linux上成功运行了所生成的二进制文件,在调整了二进制文件以修复一个小的Py2Exe输出错误之后。
- 上一次发布似乎是在2008年,这是否仍然保持?
- 它只支持2.7以下的python版本:-(
- 还有一个PY2APforMac,但我在让它为我想要的项目工作时遇到了一些问题。pypi上有一个到python3.3的端口:pypi.python.org/pypi/py2exe,这个fork支持unicode路径:github.com/goatpig/py2exe这确实是python社区所缺少的一个领域。
- 我跟踪了Cython在C中创建的代码行,用C+=1来增加变量:uPyx_t_5=Pyx_Pyint_Addobjc(Pyx_t_1,Pyx_Int_1,1,1);所以,不,python不能将+=1看作++。效率有多低。
你可能想调查努伊特卡。它使用Python源代码并将其转换为C++ API调用。然后它编译成一个可执行的二进制文件(Linux上的elf)。它已经存在几年了,并且支持各种各样的Python版本。
如果您使用它,您可能还会得到性能改进。推荐。
- 努伊特卡是一个很棒的工具。不用不用了。我只想指出一件事——不仅限于Linux——它是跨平台的——使用它的另一个原因。
- Nuitka在python 2.6、2.7、3.2、3.3和3.4上工作,是跨平台的(Linux、FreeBSD、NetBSD、MacOS X和Windows(32/64位)。其他人也可能工作。架构:x86、x86_64(amd64)和ARM。其他体系结构也可以工作,开箱即用。)
- 最近3.6.不支持。在窗户上安装是个噩梦
- 在Macos High Sierra+python 3.5.2上的效果就像是一种魅力。谢谢您!
- 这是否创建独立的可执行文件?
- @TJT263:可以。参见nuitka.net/doc/…
- @cdarke似乎自相矛盾:"生成的二进制文件仍然依赖于cpython,并使用了正在安装的C扩展模块。如果要将其复制到另一台计算机,请使用--standalone并复制创建的program.dist目录,然后执行放入的program.exe或program目录。"
第三种选择是cx_Freeze,即跨平台。
- 这里是2019年2月,自2017年底以来,PYPI上没有列出cx_Freeze版本。这个项目被放弃了吗?
我想编译一些关于使用python 2.7在Windows上创建独立文件的有用信息。
我用过Py2Exe,它很管用,但我有一些问题。
它显示了在64位Windows中创建单个文件的一些问题:使用bundle_files=1和py2exe不起作用;
必须创建一个setup.py文件才能使其正常工作。http://www.py2exe.org/index.cgi/tutorial步骤2;
我在依赖性方面遇到了一些问题,您必须通过在安装文件中导入包来解决这些问题;
我不能让它和Pyqt一起工作。
最后一个原因让我尝试pyinstaller http://www.pyinstaller.org/。
在我看来,这要好得多,因为:
我建议使用以下行创建.bat文件(pyinstaller.exe必须位于Windows路径中):
1
| pyinstaller.exe --onefile MyCode.py |
所以,我认为,至少对于Python2.7来说,一个更好更简单的选项是pyinstaller。
- --onefile标志不能帮助您使其在Windows上可移植,因为可执行文件仍然希望与api-ms-win-crt-runtime-l1-1-0.dll库(或/和其他库)链接,这些库必须通过vcredist包安装。因此依赖项仍然存在,必须在运行之前安装。
是的,可以将python脚本编译成独立的可执行文件。
pyinstaller可用于在Windows、Linux、Mac OS X、FreeBSD、Solaris和AIX下将python程序转换为独立的可执行文件。它是推荐的转换器之一。
py2exe将python脚本转换为Windows平台中唯一的可执行文件。
Cython是一种静态编译器,适用于Python编程语言和扩展Cython编程语言。
- 谢谢。我使用的是Py2Exe,根本无法让图标与之协同工作。PyInstaller第一次工作,看起来很棒!
- 我可以从Windows for Linux和MacOS创建独立的可执行文件吗?或者我应该在virtualbox上安装Linux和MacOS?我的笔记本电脑没有足够的可用空间。
- 我在这里的文档中找到了我的问题的答案:pyinstaller.readthedocs.io/en/stable/…
你可能喜欢Py2Exe。你也可以在那里找到在Linux上做这件事的信息。
使用PY2EXE…使用以下设置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| from distutils.core import setup
import py2exe
from distutils.filelist import findall
import matplotlib
setup(
console=['PlotMemInfo.py'],
options={
'py2exe': {
'packages' : ['matplotlib'],
'dll_excludes': ['libgdk-win32-2.0-0.dll',
'libgobject-2.0-0.dll',
'libgdk_pixbuf-2.0-0.dll']
}
},
data_files = matplotlib.get_py2exe_datafiles()
) |
- 我这样做了,它创建了一个python27.dll文件,它仍然是必需的。我将.exe文件移出了保存python27.dll文件的文件夹,并且.exe文件不再运行。
- 一旦你离开文件夹,它就不起作用了。
- 你能为Linux和MacOS显示这样的脚本吗?我想从Windows为Linux和MacOS创建独立的可执行文件。
我也推荐PyInstaller以获得更好的向后兼容性,如python 2.3-2.7。对于py2exe,您必须使用python 2.6
- pyinstaller有导入问题。例如:在我的例子中,我在这个目录中~/documents/python101/和ex50 pycomp.py&ex50.py在这个目录中。ex50_pycomp.py导入ex50.py。我运行了pyinstaller ex50_pycomp.py,我看到所有的程序都已完成,生成了dist。好吗?我cd到dist/ex50_pycomp/并运行ex50_pycomp it works。一旦我把这个ex50-pycom放到一个虚拟机中,这就意味着导入错误,在另一个Linux框中,它说"-bash:/ex-50-pycom:cannot execute binary file:exec format error"
- 问题1:我使用的是python2.7,但pyinstaller正在与python3 python3 setup.py build python3 setup.py install交谈。安装您的python3将获得所有pkg资源prob 3:如果使用系统路径成为一个问题,请给出类似于pyinstaller的路径--hidden import=pkgu resources--onefile file.py--path=my的路径rw-rw-r--my的路径:python3的dist文件夹py iinstaller--hidden import=pkg_resources--onefile file.py--path=/usr/local/lib/python3.5/dist packages/my_code_lib-0+‌&误8203;untaged.8.gd264bd5.‌&误8203;dirty-py3.5.egg/my_f‌&误8203;older-rw-rw-r--
对于python 3.2脚本,唯一的选择是cxfreeze。从源代码构建它,否则它将不起作用。
对于python 2.x,我建议使用pyinstaller,因为它可以将一个python程序打包为一个可执行文件,而不象cxfreeze那样输出库。
您可以找到列出的分发实用程序列表@https://wiki.python.org/moin/distribution utilities。
我使用bbfreeze,它一直工作得很好(不过还没有获得python 3的支持)。
- stackoverflow.com/questions/33683133/…我使用bbfreeze非常好的软件包。
- 它是否处理依赖关系并安装相关的PY模块?
- @挥发物3是的,所有的依赖性都得到了处理。在主机系统上安装模块有不同种类的编译。bbfreeze将把所有内容编译成多个.so文件,或者直接复制.egg文件,这些文件都应出现在一个目录(或单个文件)中。不需要安装。
py2exe将生成所需的exe文件,但您需要在要使用新exe的计算机上具有相同版本的msvcr90.dll。有关详细信息,请参阅http://www.py2exe.org/index.cgi/tutorial。
这不完全是Python代码的打包,但现在Google也有了不满情绪,这使得代码消失了。它不支持python c api,因此可能不适用于所有项目。
使用cython转换为c,编译并与gcc链接。另一种可能是,在C语言中生成核心函数(您希望使其难以逆转),编译它们,并使用python boost导入已编译的代码(另外,您可以更快地执行代码)。然后使用上面提到的任何工具进行分发。
使用pyinstaller,我找到了一个更好的方法,使用.exe的快捷方式,而不是生成--onefile。不管怎样,可能周围有一些数据文件,如果您运行的是基于站点的应用程序,那么您的程序也依赖于HTML、JS和CSS文件。把所有这些文件移到某个地方毫无意义。相反,如果我们把工作路径向上移动呢?
创建一个指向该exe的快捷方式,将其移动到顶部,然后设置目标并按指定的路径开始,以使相对路径指向distfolder:
Target: %windir%\system32\cmd.exe /c start dist\web_wrapper\web_wrapper.exe
Start in:"%windir%\system32\cmd.exe /c start dist\web_wrapper\"
可以将快捷方式重命名为"GTFS管理器"现在,当我双击快捷方式时,就好像我是用python运行文件一样!我发现这种方法比--onefile方法好,因为:
在OneFile的例子中,有一个问题是Win7OS缺少一个.dll,它需要一些预先安装等。对于通常包含多个文件的构建,没有这样的问题。
我的python脚本使用的所有文件(它正在部署一个Tornado Web服务器,需要一个完整的Freakin网站价值的文件!)不需要移动到任何地方:我只需在顶部创建快捷方式。
实际上,我可以在Ubuntu(run python3 myfile.py)和Windows(双击快捷方式)中使用这个完全相同的文件夹。
我不需要为包含数据文件等的.spec文件的过于复杂的黑客行为操心。
哦,记住在建房后删除建房文件夹,会节省空间。
- 嗨,正在更新……我决定放弃UPX压缩,最终采用一种文件方式。必须选择一个,因为UPX当前在压缩特定的DLL时有一个错误。
我听说皮伦,https://www.egenix.com/products/python/pyrun/,也是一种选择。
- 欢迎链接到解决方案,但请确保您的答案在没有它的情况下是有用的:在链接周围添加上下文,这样您的其他用户就可以知道它是什么以及为什么存在,然后引用您链接到的页面中最相关的部分,以防目标页面不可用。只不过是链接的答案可能会被删除。
我喜欢PyInstaller——尤其是"窗口"变体:
1
| pyinstaller --onefile --windowed myscript.py |
它将在dist/文件夹中创建一个*.exe文件。