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

GRB*_*GRB 21 python compilation cross-compiling python-2.7

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

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

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

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

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

exec('from lang.%s import lang' % language)
Run Code Online (Sandbox Code Playgroud)

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

我知道这个问题不时出现并且可能已经回答了,但我能找到的这类问题的最后一次出现可以追溯到2014年,如果我们考虑这个领域的变化有多快,这听起来像很久以前.

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

dan*_*nny 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'
]})
Run Code Online (Sandbox Code Playgroud)

my_package.module例如,在哪里

my_package/module.py:

<..>
def main():
    <what to run when <console cmd name here> is executed>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

安装此软件包后,可以在所有平台上运行<console cmd name here>可执行文件,以便可以成功安装软件包.

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

有关二进制轮包的更多信息,请参见pythonwheels网站.


Dan*_*kin 7

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

  • Docker是另一种选择,但请记住,它需要用户安装docker运行时才能使用您构建的容器.由于您已经说过您不希望用户必须安装任何东西,因此可能不适合您. (2认同)