如何在Linux中分发独立Python应用程序?Linux中的独立Python应用程序
我想我可以理所当然地认为最近在任何现代发行版中都有Python解释器。问题在于处理那些不属于标准库的库,例如wxPython,scipy,python密码工具包,reportlab等等。
是否有一个工作的Linux对应py2exe(顺便说一句,我从来没有尝试过)? 是否有免费的开源软件?
如何在Linux中分发独立Python应用程序?Linux中的独立Python应用程序
我想我可以理所当然地认为最近在任何现代发行版中都有Python解释器。问题在于处理那些不属于标准库的库,例如wxPython,scipy,python密码工具包,reportlab等等。
是否有一个工作的Linux对应py2exe(顺便说一句,我从来没有尝试过)? 是否有免费的开源软件?
没有。
Python对于不同的设置而言是臭名昭着的片状。部署python应用程序的唯一理智方式是将所有依赖于您的代码的解释器和库发送出去。这很可能会起作用。
你不能轻易地以分布中立的格式来做到这一点。唯一可靠的依赖关系跟踪机制内置于分发包管理系统中,并且随分发而变化。你将不得不为Fedora做rpm,debs for ubuntu和debian等。
Py2exe在Windows上正常工作。它使用所有必需的DLL和用于启动程序的python解释器的封装来构建一个发行版。安装相当简单 - 只需将其放置在目录中即可 - 因此为其制作msi文件很简单。
您可能想看看setuptools中的依赖声明。这可以提供一种方法来确保正确的软件包可以在环境中使用,或者可以由具有适当权限的人员安装。
我知道@ S.Lott知道这一点,但对于其他人:这是一种将Python库或应用程序分发给其他开发人员的好方法,他们不会介意在应用程序工作之前必须自己安装正确版本的Python。但是,向最终用户分发绝对是错误的方式,他们不知道Python是什么,绝对不会去安装它来让你的应用程序工作,对于0.2%的人来说,他们会安装错误的版。 – 2015-08-21 07:45:19
创建一个Deb(对于Debian派生的所有内容)和一个rpm(对于Fedora/SuSE)。将正确的依赖关系添加到包装中,您可以合理确信它会起作用。
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)
我的大多数先决条件都有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 [email protected]
cd [email protected] && python setup.py install --prefix=..
rm -rf [email protected]
标准的python方法是创建一个python“蛋”。
您可以使用cx_Freeze来执行此操作。它就像py2exe(将解释器和启动脚本以及所有必需的库和模块捆绑在一起),但可在Linux和Windows上运行。
它从运行环境收集依赖关系,这意味着它们也需要适合目标。如果你正在做一些像在32位Debian上构建和部署在另一个32位Debian上的东西,那很好。您可以在适当的环境中构建多个版本(例如32位和64位chroot)并分发相应的版本,以处理32/64位差异。如果你想要更通用的东西(例如在Debian上构建,部署在任何发行版上),那么这会有点模糊,具体取决于你的依赖关系。
如果你正在做一个相当直接的发布(即你知道你的构建环境和部署环境相似),那么这可以避免相当复杂的rpm/deb/egg/etc步骤(使用cx_Freeze非常容易,尤其是如果你熟悉py2exe)。如果不是,那么根据你想做多少工作,你想提供的所需版本有多大的灵活性,以及依赖关系是什么,那么从你自己的依赖安装程序到deb/rpm/egg/etc构建的任何事情都可以工作。
我认为您可以在大多数现代Linux发行版上相当安全地采用理所当然的python支持 - 只要给出了理智的错误消息,那么用户应该能够如何自行获取(你可以使用这个简单的bash启动脚本):
#!/bin/bash
if [ -e /usr/bin/python ]
then
echo "Python found!"
else
echo "Python missing!"
fi
这不是我的经验。当然你可以错误地设置第三方库,甚至不正确地安装python,但通常我从来没有遇到过标准python程序的问题。当然,当你使用新的功能时,转移到以前的版本:)。也许你正在考虑Java(TM)? – 2010-01-06 13:20:04
@ A.L.Flanagan:其实,对于我讨厌Java的人来说,我发现它对于软件发行来说非常强大。 – Marcin 2012-01-25 11:51:07