我想创建以下内容:
一个可移植版本的python,可以在任何系统上运行(安装任何以前版本的python或没有安装python)并预先配置各种python包(即django,lxml,pysqlite等)
我发现的最接近的是 的virtualenv,但这只是到目前为止。
如果我在一台机器上为python打包一个很好的virtualenv,它包含了它需要的许多库的sym链接。我可以把那些sym链接转换成他们的实际文件,但是如果我尝试将整个目录移动到另一台机器,我会在seg故障后得到seg故障。
要在另一台机器上启动python,我正在使用:
LD_LIBRARY_PATH=lib/ ./bin/python
在lib /我有我从原始机器复制的所有共享库。这里的问题是这些共享库可能依赖于我不包括的其他共享库,因此在其他Linux发行版上执行此操作不起作用。可能是由于它回退到安装在系统上的旧共享库,这些库不能与我复制的内容一起工作。
任何人都知道如何使这个工作?这有可能吗?
编辑:
为了澄清,期望的结果是创建一个python二进制文件的tar.gz和相关的包(django,lxml,pysqlite等),可以在任何基于Linux的系统上提取和运行,即(ubuntu 8.04,redhat 5,suse) 11等,所有32位发行版,其中本地安装的python版本不会影响tar.gz中的内容。
我刚测试了这个并且效果很好。
获取要安装的python副本并解压缩并首先cd到untarred文件夹。
还可以获得setuptools的副本并解压缩。
/opt/portapy
下面使用的当然只是我为这篇文章提出的名称,它可以是任何路径,并且应该涂焦完整路径,并且由于绝对路径链接,应该在任何系统上使用相同的路径。
mkdir /opt/portapy
cd <python source dir>
./configure --prefix=/opt/portapy && make && make install
cd <setuptools source dir>
/opt/portapy/bin/python ./setup.py install
在portapy文件夹中创建虚拟env文件夹。
mkdir /opt/portapy/virtenv
/opt/portapy/bin/virtualenv /opt/portapy/virtenv
cd /opt/portapy/virtenv
source bin/activate
完成。您已准备好在此安装所有库,并可选择以这种方式创建多个虚拟环境。
然后你可以把整个问题放在一边 /opt/portapy
文件夹并将其传输到同一个拱门的任何Linux系统,我怀疑的原因。
我编译2.7.5 ond centOS 5.8 64bit并将文件夹移动到Cent6.9系统,它运行完美。
我不知道这是怎么回事。如果是的话,他们不需要为不同的平台分发python的二进制包。你不能简单地分发将在任何平台上运行的python。它必须从该拱门的源头构建。 Virtualenv希望你告诉它使用哪个系统python(使用链接)。
这几乎适用于链接系统库的任何二进制包。同样,如果可能,我们将不需要任何特定于平台的二进制分发。
但是,您可以实现您想要的一部分。也就是说,在另一台没有安装python的机器上运行python,只要它是同一个arch。这背后是相同的概念 冷冻,或py2exe / py2app / pyinstaller。解释器捆绑在一个独立的环境中。所以应用程序可以在任何类似的平台上运行。
编辑
我刚刚意识到,虽然你的问题在谈论“系统”时,你的标题包含引用“linux”。 Linux有不同的风格,所以为了使它工作,你必须为多个arch构建它,并且还完全包含独立链接。您可以尝试使用构建包 pyinstaller 并使用它包含在您的项目中。
你可以尝试在你的virtualenv中从源代码构建python:
$ ./configure --prefix=/path/to/virtualenv && make && make install
如果您仍然遇到libs链接问题,您也可以进行调查 静静地建造它
我不确定单纯用Python工作是什么方式。您可能更幸运的是Puppet of Chef,它们是可用于创建本地环境的配置工具。有很多代码可以在任何Linux plus OSX上安装virtualenv和python(可能不是Windows)。
您的工作流程是安装chef或Puppet(您的选择),运行脚本来安装您想要的Python,然后输入virtualenv并pip install您可能需要的任何软件包。
对不起,这并不像virtualenv那么容易,但它更强大。
好吧,因为我很少接受“不能做”,所以有办法做到这一点。警告:它不漂亮,你可能应该研究一个不同的场景。
您需要做的是确定此顶级目录的标准位置。其次,使用该目录作为根目录,您需要在要运行它的每个Linux发行版上编译Python。为此你可以使用类似“/ usr / local / myappname / platform /”的东西来配置和编译Python。在每种情况下,用平台名称替换“platform”,例如“/ usr / local / rhel /” ”。如果内存服务配置选项,您在这里寻找的是--prefix。
编译完每个发行版之后,您将需要一个脚本来确定要使用哪个发行版,并设置环境变量或让它创建符号链接到python的相应“安装”。然后我会在该树中使用virtualenv和bootstrap来保持“使用中”的python库更加具体。
我想不出默认情况下没有Python的常见Linux发行版。因此,您可以使用setup.py和/或基本python脚本来编写此脚本,因为您应该能够依赖Python存在 - 即使它在RHEL安装中的版本也是如此。就个人而言,我发现上述方法过于复杂,但它可以满足您所述的要求,并允许最终脚本。当然,您可以使用shar(SHell ARchive)将所有这些内容转换为可运行的shell脚本来进行安装,并避免使用辅助脚本。如果您对生成的shel存档进行gzip,那么您可以在目标系统上解压缩它并执行它来设置所有内容。
所有这一切,我不会推荐这个。我建议确定您可以运行的最低Python版本,并确保尽可能安装分发版,如果需要从repo下载并安装。然后,使用virtualenv和bootstrap与requirements.txt将必要的python库和应用程序安装到virutalenv中。对于那个看 这个文件