关于发布:我如何发布python程序?

How can I distribute python programs?

我的应用程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
main.py
windows/
    __init__.py
    mainwindow.py
    ...
model/
    __init__.py
    orders.py
    ...
resources/
    image1.png
    logo.jpg
    ...

程序以main.py启动。有没有一种好的方法可以用它创建一个"最终"应用程序?我在想类似于py2exe/py2app的东西,但是不需要将python解释器/模块复制到只有一个可执行文件的应用程序中。

我看过distutils,但这看起来像是在python目录中安装了一个程序,这在非Linux平台上不常见。

目前,我只是将整个源文件夹复制到目标计算机上,并在Windows上创建一个main.pyw的别名。一些不便:

  • 图标是默认的python图标。
  • 我必须手动创建别名。
  • 在我的源目录中有很多其他文件,比如源代码管理文件夹。
  • 我必须手动将main.py重命名为main.pyw
  • 如果目标机器上只有`.pyo*文件就好了。没有真正的理由,我只是不喜欢有不必要的文件。
  • 小精灵

    如何创建一个良好的自动分发?

    • 对于Windows?(这是我目前唯一需要支撑的平台。)
    • 对于Mac?
    • 对于Linux?
    • 小精灵

      • "我看过distutils,但这看起来像是在python目录中安装了一个程序,这在非Linux平台上不常见。"你为什么这么说?你读过什么文字?这当然是不真实的,你是从哪里得到这种印象的?
      • 可能是用python编写的分发程序的副本
      • 相关:从Python项目创建单个可执行文件


      我强烈推荐PyInstaller,它非常无缝地支持所有主要平台。与PY2Exe和PY2App一样,它在Windows上生成了标准的可执行文件,在OS X上生成了一个应用程序包,但是它的好处是,它还可以自动解决常见的依赖项,并且不需要额外的配置调整就可以包含这些依赖项。

      还要注意,如果您要将python 2.6部署到Windows,那么应该将此补丁应用到pyinstaller主干。

      您表示不需要安装程序,但Inno安装程序是Windows平台的一个易于使用和快速安装选项。

      • 我不确定这是过分杀人。将应用程序与pyinstaller捆绑在一起实际上比其他方法更容易,尤其是那些依赖于C扩展的方法…在大多数情况下,只需一行命令行调用即可。安装python+dependencies+应用程序本身(无论是通过distuils等,还是仅仅是一个zip文件)更为重要,特别是如果开发人员无法自己手动配置目标计算机,并且需要向客户机提供指令时。至少在Windows上,我认为这种分发方式是有意义的。
      • PyInstaller有点不方便,当您使用用PyInstaller创建的可执行文件时,开始执行需要几秒钟。
      • 正是我要找的。有时我需要让我的脚本在我无法安装任何东西的计算机上运行。我需要一个没有外部依赖性的单一可执行文件。我可以抽出几秒钟来启动。谢谢您!
      • 不建议用于小型应用程序,因为一个简单的Hello world程序需要500MB空间和3-5秒的初始化时间。


      分发Python应用程序的正常方式是使用distuils。它既用于分发库类型的Python模块,也用于分发Python应用程序,尽管我不知道它如何在Windows上工作。在任何情况下,如果使用distutils,在Windows上都必须单独安装python。

      我可能会建议您在Linux和Py2Exe或类似的Windows环境中使用双功能软件来分发它。对于OS X,我不知道。如果它是一个最终用户应用程序,你可能想要一个磁盘映像类型的东西,我不知道该怎么做。但是阅读本文了解更多关于它的用户体验的信息。对于为程序员开发的应用程序,您可能也可以在OS X上安装distutils类型。

      • Mac和Linux目前并不那么重要。py2app制作.app包。我认为在.dmg中发布Mac应用程序已经过时了,应该使用.zip。是否可以使用distuils创建目录dist,并将所有相关文件复制到该目录中?
      • @gs:sdist命令将创建所有源文件的tar文件。
      • @GS:在.dmg中运送Mac应用程序实际上非常常见。.dmg是磁盘映像,而不是应用程序的格式(即.app)。因此,您通常会在.dmg中找到一个.app,以及一些自述文件。
      • @我不知道你为什么要distutils做一个目录dist并把文件复制到那里,你可以自己做。distutils做了很多事情,包括创建Windows安装程序,并且从python 2.6还可以在"开始"菜单中创建链接。不过,它需要您单独安装python,所以对于最终用户应用程序,我认为py2exe是更好的解决方案,因为它包含自己的python。Alexander Limi在他的博客中详细讨论了OS X的发货/安装程序,因此我遵从他的意见。


      FredrikLundh的squeeze.py可以创建一个不包含python解释器,而是包含字节码的文件。使用正确的参数,您可以在结果文件中包含其他文件、模块等。我在一个项目中成功地使用了它。生成的程序运行在OS X、Linux和Windows上,没有任何问题!

      ps:每台机器都需要一个与squesh.py生成的字节码兼容的python解释器。如果需要,您可以为不同版本的Python生成不同的字节码版本(只需使用正确版本的Python运行squence.py)。


      我可能错了,但是Ironpython没有内置的Windows编译器吗?

      网址:http://www.ironpython.net

      [编辑]

      尝试一下cx-freeze,它是迄今为止我使用过的最好的.py-to.exe(加上一些.dlls)编译器。

      http://cx-freeze.sourceforge.net网站/


      我认为这也值得一提皮克斯(考虑到更多的关注这个问题,而不是问题本身)。根据其自身描述:

      PEX files are self-contained executable Python virtual environments. More specifically, they are carefully constructed zip files with a #!/usr/bin/env python and special __main__.py that allows you to interact with the PEX runtime. For more information about zip applications, see PEP 441.

      当我阅读关于Python打包的概述时,我偶然发现了它。他们把这张漂亮的照片贴在那里:enter image description here

      总结一下:如果您可以依赖于目标机器上安装的python,那么使用pex生成一个自包含的?可执行文件?例如,它的文件大小可能比pyinstaller生成的可执行文件小。


      如果要在Windows上分发,请使用安装程序安装所有需要的相关文件/接口。分发setup.exe。这是上窗户最好的方法。否则用户会抱怨。

      • 我不需要安装程序,因为只有一个用户要使用这个程序。当然,当为更多的用户编写一个程序时,这是Windows必须具备的。
      • @GS:哦,只有一个用户。好的,那么我建议您制作一个基本的distutils包,或者是源发行版,或者是Windows二进制安装程序。这绝对是分发Python模块的一种简单而好的方法。


      最方便的*跨平台分发python桌面应用程序的方法是依赖跨平台的Conda包管理器。有几种工具可以使用它:

      • miniconda安装-自动下载miniconda并为应用程序创建独立的conda环境的PowerShell/bash脚本。支持PIP,但似乎没有维护,并且存在HTTPS下载问题。
      • Continuum的Anaconda项目和(Conda)构造函数。两者都使用康达。(conda)构造函数似乎能够在Windows上创建独立的安装程序,甚至NSI安装程序,但不支持PIP。看起来像Python/小Python安装工。
      • pyappshare-最终用户首先安装miniconda/anaconda(类似于运行时环境)。然后,单个install batch/bash脚本根据yaml规范创建独立的conda环境。该应用程序本身也是一个conda/pip包,安装到环境中,并创建一个可执行的入口点。自动创建跨平台桌面和程序快捷方式。它们激活环境并启动应用程序。支持PIP。
      • 小精灵

        *对开发人员来说最方便。为最终用户提供了足够的便利。