为每个操作系统冻结python脚本

时间:2017-02-26 11:12:21

标签: python python-2.7 compilation cross-compiling

在过去的几年里,我在python中编写了一个不错的小程序,现在我想分发它,但是我的第一次尝试并没有遇到太多的热情,因为许多潜在的用户并没有#39; t喜欢下载和安装python的想法以及运行我的应用程序所需的所有依赖项。

我环顾了几周寻找解决方案,以某种方式将我的代码编译成易于为每个人运行的东西,但我对我发现的内容并不满意。

我对冻结应用程序而不是真正编译它的想法没有任何问题。这只意味着最终用户将等待几秒钟来下载应用程序,并在他/她的硬盘上占用更多空间。

我的问题是找到一种方法将所有应用程序打包成每个操作系统的可执行文件(让我们说大的:windows,mac,linux - 显然是每个操作系统的不同可执行文件),而不需要安装虚拟机或葡萄酒或类似选项。我强烈怀疑这是可能的,因为我看到一堆人工游戏的打包方式与我打包应用程序的方式完全一致,但我不知道如何获得相同的结果。程序

示意图,我的应用程序需要一个控制台来运行,并包含一些自制的包,numpy和matplotlib。它还有一个系统,支持多种动态包含语言文件的语言,覆盖以前的设置:

exec('from lang.%s import lang' % language)

我怀疑这可能会产生一些问题。最后,程序需要一些文件夹来保存第一次运行中的设置,日志等,因此也应该包含这些文件夹。我的计算机运行ubuntu伙伴16.10(x64),python版本是2.7,但将来我打算将它翻译成python 3.创建的可执行文件可以是单个重文件,几乎包含所需的一切或轻量级文件,其他一切都可以发现在附近的文件夹;我真的不喜欢一种解决方案或另一种解决方案。

我知道这个问题时不时出现,可能已经回答了,但我能找到的这类问题的最后一次出现可以追溯到2014年,如果我们考虑事情发生变化的话,这听起来像很久以前在这个领域。

编辑:由于似乎没有我提出的条件的解决方案,我可以考虑设置一些模拟器/包装/兼容层/无论为不同的操作系统运行冰柜,但我和#39;我不知道该怎么做。我在这里和那里读到,葡萄酒并不总是正常工作,并且无法在linux上找到任何可以编译mac的东西。据我所知,该程序不应该对32/64位系统进行不同的编译,但是如果有一种简单的方法来编译每种可能性,它就会很好。虚拟机仍然不行,现在我没有足够的空间来设置两个或更多虚拟机(这是ssd磁盘的重大缺点......),更不用说支付了用于操作系统的许可证,每年可以使用几次来编译免费软件。

8 个答案:

答案 0 :(得分:8)

首先结合事情。

  • Python已经是跨平台的
  • 解释Python代码,而不是本机编译语言,不需要编译
  • Python setuptools中存在标准方法来分发具有跨平台兼容性的可执行脚本
  • 第三方python库可以包含本机代码(在C中),这些代码在安装时需要编译,或者包维护者可以使用二进制包。 NumPy和matplotlib属于这一类,并且可以为Windows AFAIK提供二进制包。

以下是安装可执行脚本的一些示例setup.py代码:

from setuptools import setup, find_packages
setup(<...>,
      entry_points={'console_scripts': [
          '<console cmd name here> = my_package.module:main'
]})

my_package.module的位置,例如

my_package/module.py

<..>
def main():
    <what to run when <console cmd name here> is executed>

然后可以将包作为标准python模块分发,可以通过pip安装。如果代码是开源的,它可以托管在PyPi上(有关如何设置,请参阅PyPi站点上的说明)。

否则,可以构建源代码或二进制轮包(分别为python setup.py sdistpython setup.py bdist_wheel)并将其分发给您的用户。

二进制轮需要在它们要安装的平台上构建,源代码分发将在任何平台上运行,但需要在安装时执行代码,因为它们包含纯粹的源代码。

请注意,构建/安装二进制轮包需要pip版本&gt; = 6.0setuptools&gt; = 26.0

安装此软件包时,&lt; console cmd name here>可执行文件可以在所有平台上运行,可以成功安装软件包。

对于执行此操作的简单示例包,请参阅hello-world-python-package,特别是其setup.py

有关二元轮包的更多信息,请参阅pythonwheels site

答案 1 :(得分:7)

因为我还没有在这里看到它,但我想我会提出Docker。它似乎是一个可分发的VM,包含某种包或应用程序。 github上有一个免费的社区版https://github.com/docker/docker。我自己从未使用它,但它似乎符合您的所有标准 - 轻量级,免费和平台无关。只是值得探索的东西。

答案 2 :(得分:4)

期望程序成为独立程序包的唯一平台是ms-windows。这主要是出于与本机工具链有关的历史原因。例如,对于ms-toolchain(IIRC)的2016版本,像numpy这样的Python扩展模块必须使用完全编译与ms本身相同的ms-toolchain版本。这使得为​​ms-windows构建扩展模块变得非常痛苦。

大多数类UNIX操作系统都具有功能包管理功能(尽管在Apple的OS-X中这是由第三方提供的)。这使得安装Python相对容易。

将您的应用程序打包到像youtube-dl这样的zip文件中可能会有所帮助。我已经编写了一个名为build.py的脚本,可以为我的某些程序执行此操作。

答案 3 :(得分:3)

初步反应

  • 对于Windows,请使用p2exe
  • 对于Linux使用python's freeze
  • 对于macos使用相同的冻结 - 应该工作(只是一个猜测,只能通过一个谷歌搜索举行)

(您的计划可能需要更改,例如__file__无法使用)

初始问题的可能替代方法

  

&LT; ...&GT;没有多少热情,因为许多潜在用户没有   喜欢下载和安装python的想法

通过在程序旁边加入python安装程序,也许可以解决用户异议问题。 (实际的python安装程序或http://portablepython.com/
即,不仅添加安装程序的链接,还添加所有安装程序以及可能的bat / sh脚本来安装所有内容。

答案 4 :(得分:3)

JAVA怎么样?将你的python代码包装成java分发为jar或.exe?

http://www.jython.org/jythonbook/en/1.0/JythonAndJavaIntegration.html

您可能会发现此QA对您的案例非常有用。 Distributing my Python scripts as JAR files with Jython?

答案 5 :(得分:2)

通过写作&#34;冻结&#34;我不知道你到底是做什么的。应用程序,但如果我理解,你需要将代码编译成安装程序,只需安装运行程序所需的所有库和文件,这样它就可以处理任何noob计算机用户。

确定。现在你有两个选择:

A)单独为每个系统制作安装程序 - 您可以使用Inno setup或PackageBuilder(在Mac上)等工具来创建安装程序,检查是否已经安装了python(如果没有安装它)并复制你的文件+在桌面上制作快捷方式(或类似的东西)+运行外部脚本(如果你需要)或如果你需要Windows的二进制文件,你可以使用Py2exe或mac {{3} }。在Linux上没有类似的东西,但如果使用Linux的人通常是高级用户。

如果我知道所有平台都没有自动构建器来构建python安装程序,但是如果你有一些钱,你可以用Py2app来增强你的工作。

B)创建自己的脚本 - 如果用户已经拥有python,您可以手动下载和安装文件的脚本(如果是针对高级用户的产品,请通过我最好的解决方案,但是如果你做了一些GUI对于菜鸟来说不会有问题)

答案 6 :(得分:2)

<强>的Ren'Py

你曾多次提到Ren'Py。它的documentation描述了如何将Python代码添加到游戏中。 Python Statements部分甚至描述了how to add third party packages(例如numpy和matplotlib)。它可以generate files for Windows, Mac, and Linux。如果你能按照你想要的方式运行你的应用程序,并且你已经熟悉它,那么你应该使用它。

<强> PyInstaller

另一个选项是PyInstaller。在Supporting Multiple Operating Systems部分,它说明了这一点:

  

如果您需要为多个操作系统分发应用程序,例如Windows和Mac OS X,则必须在每个平台上安装PyInstaller,并在每个平台上单独捆绑您的应用程序。

第二段描述了如何在一台机器上执行此操作:

  

您可以使用虚拟化从一台计算机上执行此操作。免费的virtualBox或付费的VMWare和Parallels允许您以“访客”的身份运行另一个完整的操作系统。您为每个“来宾”操作系统设置虚拟机。在其中安装Python,应用程序所需的支持包以及PyInstaller。

PyInstaller宣传support for numpy and matplotlib

虚拟机和托管操作系统

您说您的SSD没有空间用于虚拟机。您可以购买外部USB硬盘并将虚拟机存储在其上。或者您可以使用操作系统托管提供商。您可以使用Google了解有关这些内容的更多信息。如果您对如何使用特定托管服务提供商有疑问,则应创建新问题。

跨平台测试

即使您使用Ren'Py,您几乎肯定需要在虚拟机或托管操作系统上测试结果。确保程序在其他平台上正确运行的唯一方法是在这些平台上测试它。托管解决方案允许您避免“支付一年中几次使用的操作系统许可证来编译免费软件”。但是,你仍然会花钱买东西。

免费价格

如果你的目标是为Windows,Mac和Linux开发Python应用程序而不花任何钱,那么你可能会坚持使用Ren'Py并依靠用户来帮助你在他们的操作系统上测试你的应用程序。

答案 7 :(得分:2)

在工作中,我做了你想做的事情,最后我写了自己的代码来做。一切都建立在Linux上,但我同时提供Linux和Windows软件包。这些软件包包括Python解释器和库,无论客户是否已经安装了Python,它们的工作方式都相同。

基本上,您需要一个嵌入Python解释器的小程序,并将其设置为仅加载您发布的Python代码,而忽略任何系统安装的Python。如果写得正确,可以为要支持的每个体系结构交叉编译该程序。然后,您将发布架构所需的Python DLL,以及包含您将使用的Python代码的zip文件(您只需要.pyc.pyo个文件)。此zip文件还必须包含您需要的标准库。

注意事项:

  • 您仍然需要虚拟机进行测试。
  • 为每个架构正确设置C交叉编译器可能具有挑战性。
  • Python的site.py和virtualenv使用的那个都不能完全隔离你的系统Python安装。我必须制作我自己的site.py版本。
  • 很容易错误地链接到系统Python。在构建脚本中如何使用pkg-config和编译器参数时要非常小心。
  • Python很容易错误地加载系统Python库。设置Python路径时要非常小心,可能需要Py_IgnoreEnvironmentFlag
  • 对于Windows,你可以使用py2exe,它会比我建议的更容易。我不使用py2exe主要是因为我在非Python应用程序中嵌入了Python代码。

因为我的应用程序在Go中有一些Python,所以我将我的包装器编写为Go包,通过cgo调用Python WSGI代码。您可以看到大多数Python嵌入代码here。但是,这个回购不是全部故事:自定义Python构建的脚本以及应用程序本身的构建脚本和初始化代码现在都不公开。