Linux中的独立Python应用程序



如何在Linux中分发独立的Python应用程序?

我认为,在任何现代发行版中,最近的Python解释器都是理所当然的。问题是处理那些不属于标准库的库,即wxPython、scipy、python加密工具包、reportlab等等

有没有与py2exe(顺便说一句,我从未尝试过)相对应的Linux?有免费的开源软件吗?

创建一个deb(用于Debian派生的所有内容)和一个rpm(用于Fedora/SuSE)。将正确的依赖项添加到包中,您可以合理地确定它会起作用。

您可以使用cx_Freeze来执行此操作。它就像py2exe(将解释器和启动脚本以及所有必需的库和模块捆绑在一起),但在Linux和Windows上都可以使用。

它从运行环境中收集依赖项,这意味着它们也需要适合目标。如果你正在做一些事情,比如在32位Debian上构建,并在另一个32位Deban上部署,那么这很好。您可以通过在适当的环境中构建多个版本(例如32位和64位chroot)并分发适当的版本来处理32/64位差异。如果你想要更通用的东西(例如,在Debian上构建,在任何发行版上部署),那么这会有点模糊,具体取决于你的依赖关系。

如果您正在进行一个相当简单的分发(即,您知道您的构建环境和部署环境是相似的),那么这就避免了相当复杂的rpm/deb/egg/etc步骤(使用cx_Freeze非常容易,尤其是如果您熟悉py2exe)。如果没有,那么从滚动自己的依赖性安装程序到deb/rm/egg/etc构建,任何事情都会起作用,这取决于你想做多少工作,你想提供多大的灵活性和所需版本,以及依赖性是什么。

您可能需要查看setuptools中的依赖声明。这可能提供了一种方法来确保正确的软件包在环境中可用,或者可以由具有适当权限的人安装。

在与分发无关的格式中无法轻松做到这一点。唯一可靠的依赖性跟踪机制内置于发行版上的包管理系统中,并且会因发行版而异。你将有效地为fedora做rpm,为ubuntu和debian等做debs。

Py2exe在Windows上运行良好。它构建了一个包含所有必要DLL和启动程序的python解释器的包装器的分发版。安装起来相当简单,只需将其放在一个目录中即可,因此为其制作msi文件非常简单。

Setuptools对我来说太过分了,因为我的程序的使用非常有限,所以这里是我自己开发的替代方案。

我绑定了一个包含所有先决条件的"第三方"目录,并使用site.addsitedir,这样它们就不需要全局安装。

# program startup code
import os
import sys
import site
path = os.path.abspath(os.path.dirname(__file__))
ver = 'python%d.%d' % sys.version_info[:2]
thirdparty = os.path.join(path, 'third-party', 'lib', ver, 'site-packages')
site.addsitedir(thirdparty)

我的大多数prereq都有setup.py安装程序。每个捆绑模块都有自己的"安装"过程,因此任何自定义的东西(例如./configure)都可以自动运行。我的安装脚本在安装过程中运行这个makefile。

# sample third-party/Makefile
PYTHON_VER = `python -c "import sys; 
        print 'python%d.%d' % sys.version_info[:2]"`
PYTHON_PATH = lib/$(PYTHON_VER)/site-packages
MODS = egenix-mx-base-3.0.0 # etc
.PHONY: all init clean realclean $(MODS)
all: $(MODS)
$(MODS): init
init:
    mkdir -p bin
    mkdir -p $(PYTHON_PATH)
clean:
    rm -rf $(MODS)
realclean: clean
    rm -rf bin
    rm -rf lib
egenix-mx-base-3.0.0:
    tar xzf $@.tar.gz
    cd $@ && python setup.py install --prefix=..
    rm -rf $@

标准的python方法是创建一个python"Egg"。

您可以看看本教程,或者这一页关于setuptools的内容。

我认为在大多数现代Linux发行版上,你可以相当安全地认为python支持是理所当然的——对于那些没有python的发行版,只要给出一个合理的错误消息,用户就应该能够自己获得它(你可以使用一个简单的bash启动脚本):

#!/bin/bash
if [ -e /usr/bin/python ]
then
    echo "Python found!"
else
    echo "Python missing!"
fi

没有。

Python在不同的设置方面是出了名的不稳定。部署python应用程序的唯一合理方法是提供代码所依赖的整个解释器和库包。这很可能奏效。

更新2019:我支持这一点。Virtualenv是一种将库和解释器打包在一起的方式。Tox是测试解释器/依赖矩阵的测试工具。Docker是一种广泛使用的部署捆绑包的方法。

最新更新