问题 为Linux创建可移植Python(本地安装)


我想创建以下内容:

一个可移植版本的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中的内容。


12859
2018-06-28 17:29


起源

已经存在了 便携式蟒蛇 或者,更简单的是,在没有安装的情况下在几个环境中使用Python 到处都是蟒蛇 - DhDd


答案:


我刚测试了这个并且效果很好。

获取要安装的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系统,它运行完美。


7
2017-09-11 21:44



看起来干净,充满希望,我需要这样的东西,对于无根环境,希望它有效! - jmoreno
@tahoe,是否可以将带有python的文件夹放入具有其他名称的目录中,与第一台计算机上的名称不同?有没有解决方法? - Dmitry Wojciechowski
它应该是可能的,但您需要编辑激活脚本以指向我认为正确的目录。另外我需要注意的是,如果它在非常相似的系统上完成,那么这种方法效果最好,因为我在Ubuntu和CentOS之间遇到了这样的问题,其中SSL包是针对完全不同的版本编译的,不会加载。 - tahoe
此解决方案工作正常。注意:确保 检查GNU libc版本。如果你使用GNU libc 2.14在linux上编译python并尝试在另一台带有GNU libc 2.5的linux机器上运行它会给出错误。 - DKG


我不知道这是怎么回事。如果是的话,他们不需要为不同的平台分发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链接问题,您也可以进行调查 静静地建造它


6
2018-06-28 17:44





我不确定单纯用Python工作是什么方式。您可能更幸运的是Puppet of Chef,它们是可用于创建本地环境的配置工具。有很多代码可以在任何Linux plus OSX上安装virtualenv和python(可能不是Windows)。

您的工作流程是安装chef或Puppet(您的选择),运行脚本来安装您想要的Python,然后输入virtualenv并pip install您可能需要的任何软件包。

对不起,这并不像virtualenv那么容易,但它更强大。


1
2018-06-28 18:12





好吧,因为我很少接受“不能做”,所以有办法做到这一点。警告:它不漂亮,你可能应该研究一个不同的场景。

您需要做的是确定此顶级目录的标准位置。其次,使用该目录作为根目录,您需要在要运行它的每个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中。对于那个看 这个文件


1
2018-06-30 22:26





你可以试试这个: http://downloads.activestate.com/ActivePython/ 在菜单中查看: 下载>> ActivePython


-1
2018-06-05 15:18