2017-02-26 63 views
20

在过去的几年里,我用python编写了一个很好的小程序,现在我想分发它,但是我的第一次尝试没有遇到太多的热情,因为许多潜在的用户不喜欢下载和安装python以及运行我的应用程序所需的所有依赖关系的想法。冻结每个操作系统的python脚本

我环顾四周寻找一种解决方案,将代码编译成易于运行的东西,但我对所发现的内容并不满意。

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

我的问题是找到一种方法来将所有应用程序打包到每个操作系统的可执行文件中(比如说,Windows,Mac,Linux--对于每个操作系统显然是不同的可执行文件),而无需安装虚拟机或葡萄酒或类似的选项。我强烈怀疑这是可能的,因为我看到一堆ren'py游戏打包完全符合我想打包应用程序的方式,但是我不知道如何获得与我的程序相同的结果。

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

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

我怀疑这可能会产生一些问题。最后,该程序需要几个文件夹来保存其设置,日志等在第一次运行,所以这些也应该包括在内。我的电脑运行ubuntu mate 16.10(x64),python版本是2.7,但是将来我打算将它翻译成python 3.所创建的可执行文件可以是单个重文件,其中包含几乎所有需要的文件或轻量文件,其他所有文件都可以在附近的文件夹中找到;我没有对一种解决方案或其他解决方案的偏好。

我知道这个问题不时出现,可能已经回答了,但这种问题的最后一次发现可以追溯到2014年,如果我们考虑如何快速地在这个领域的变化。

编辑:既然有似乎是我提出的,我能想到的设置了一些仿真器/包装/兼容层/不管运行冷冻不同操作系统的条件没有解决办法,但我不知道该怎么办。我在这里和那里看到,葡萄酒并不总是正常工作,并找不到任何东西在Linux上为Mac编译。据我了解,程序不需要32/64位系统的不同编译,但是如果有一种简单的方法来编译每种可能性,它都会很好。虚拟机仍然不行,现在我的磁盘上没有空间来建立两个或两个以上的虚拟机(这是ssd磁盘的巨大缺点......),更不用说支付操作系统许可证了每年使用几次来编译一个免费软件。

+1

打包您的程序所需的所有文件/文件夹应该不成问题,大多数工具都支持该功能。我认为最大的障碍是交叉编译 - 据我所知,只能为您当前使用的平台生成可执行文件,因此您必须在Windows上冻结以获取Windows .exe并冻结到Linux得到一个linux可执行文件等 –

+0

@Rawing如果我理解正确,ren'py似乎交叉编译python没有任何问题。我没有可能为每种可能的环境运行虚拟机,所以如果有另一种解决方案,它会很棒。 – GRB

+0

如果您真的坚持不拥有虚拟机,您可以使用持续集成服务在各种操作系统中运行您的打包程序。 –

回答

5

由于我没有看到它在这里,但我想我会带来Docker。它似乎是一个可分发的虚拟机,它包含某种软件包或应用程序。 github上有免费的社区版本https://github.com/docker/docker。我从来没有用过它,但它似乎符合你的所有标准 - 轻量级,免费和平台不可知论。只是要探索。

+0

我正在研究这个,它看起来很有前途。有很多选项我必须检查,但现在我有一种感觉,这是我需要的。 – GRB

+0

是的,它看起来相当广泛,但我很高兴听到你发现它很有用。我将不得不周到了解更多关于这些日子中的一个。我的邻居是一位IT顾问,他表示他最近的大部分工作都是将其整合到各个公司作为其软件开发的新平台。无论如何,祝你好运。 –

+2

Docker是另一种选择,但请记住它需要用户安装docker运行时才能使用您构建的容器。既然你已经说过你不想让用户安装任何东西,它可能不适合你。 – danny

7

夫妇的事情第一。

  • 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模块,可以通过安装3210。如果代码是开源的,它可以托管在PyPi上(请参阅PyPi网站上有关如何安装的说明)。

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

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

请注意,建筑/安装二进制轮组件需要pip版本> = 6.0setuptools> = 26.0

安装此软件包时,将在此处提供一个<控制台cmd名称>可执行文件,以便在可以成功安装软件包的所有平台上运行。

对于一个简单的示例包,请参阅hello-world-python-package,特别是其setup.py

查看pythonwheels site了解二进制轮组的更多信息。

+0

感谢您的回答,但这不是我要找的。我试图分发一个独立的程序,而不是可以包含在其他程序中的python模块。我的问题是,现在我的程序需要最终用户安装python,numpy和matplotlib才能运行,要求阻止最终用户,特别是Windows用户。这就是为什么我试图“编译”,或更正确地冻结我的代码。 – GRB

+0

最常用的Python实现(来自python.org,通常被称为CPython)*不会*编译Python代码。进入python * bytecode *,它们基本上是CPython虚拟机的机器指令。但是,这不是Python实现的要求。请参阅[dis'模块的文档](https://docs.python.org/3.6/library/dis.html)。 –

+0

@GRB这种情况下,我不认为其他人需要安装python和libs。在安装结束时,你会得到一个可执行文件,只要你想。我建议你多关注一下setuptools –

2

我不知道通过编写“freeze”应用程序你真的是什么东西,但是如果我理解它,你需要将你的代码编译成安装程序,只需安装运行程序所需的所有库和文件,所以它可以处理任何noob计算机用户。

好的。现在你有两个选择:

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

如果我知道没有像所有平台一样的自动构建器来构建python安装程序,但是如果你有一些钱,你可以用Bitrock Install Builder来提高你的工作。

B)让自己的脚本 - 如果用户已经拥有了Python中,你可以下载并手动安装文件脚本(由我最好的解决方案,如果是高级用户提出的产品,但如果你做一些GUI岂不会对新手来说是个问题)

4

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

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

可能有用的是将您的应用程序打包成一个zipfile,如youtube-dl。我写了一个名为build.py的脚本,用于我的一些程序。

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允许您以“guest”的身份运行另一个完整的操作系统。您为每个“guest”操作系统设置一个虚拟机。在其中安装Python,应用程序需要的支持包以及PyInstaller。

PyInstaller发布了support for numpy and matplotlib

虚拟机和主机操作系统

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

跨平台测试

即使你使用的Ren'Py,你几乎肯定会需要测试虚拟机或主机操作系统的结果。只有这样,可以肯定,你的程序将在其他平台上正确运行是测试它在这些平台上。该托管解决方案可以让你避免“支付将用于每年几次编译一个免费软件,操作系统许可证”。但是,您仍然会为托管花钱。

价格免费

如果你的目标是开发适用于Windows,Mac和Linux Python应用程序而无需花费任何金钱,那么你可能卡住的Ren'Py依靠用户来帮助你在他们的操作系统上测试你的应用。

2

初始反应

  • for Windows一起使用p2exe
  • 对于Linux的使用python's freeze
  • 适用于MacOS使用相同的冻结 - 应该工作(只是猜测,只能由一个谷歌搜索举起)

(可能需要对您的程序进行更改,例如__file__无法使用)


可能的替代办法最初的问题

< ...>并没有遇到太大的热情,因为许多潜在用户并没有像 下载和安装Python

的想法

也许用户的反对可以治愈的,通过包括旁边的程序Python安装程序本身。 (无论是实际的Python安装程序或http://portablepython.com/
即加不只是链接到安装,但所有的安装和可能的BAT/SH脚本安装一切。

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编写的,所以我将封装器作为一个Go包打包,通过cgo调用Python WSGI代码。你可以看到大部分的Python嵌入代码here。但是,回购并不是全部内容:自定义Python构建脚本以及构建脚本和应用程序本身的初始化代码现在都不公开。

相关问题