14

我正在寻找创建以下内容:

可在任何系统上运行的可移植版本的 python(安装任何以前版本的 python 或未安装 python)并预先配置了各种 python 包(即 django、lxml、pysqlite 等)

我发现与上述最接近的是virtualenv,但这只是到目前为止。

如果我在一台机器上为 python 打包一个不错的 virtualenv,它包含指向它需要的许多库的符号链接。我可以获取这些符号链接并将它们转换为它们的实际文件,但是如果我尝试将整个目录移动到另一台机器上,我会在段错误之后遇到段错误。

要在另一台机器上启动 python,我使用:

LD_LIBRARY_PATH=lib/ ./bin/python

在 lib/ 中,我拥有从原始机器复制的所有共享库。这里的问题是这些共享库可能依赖于我不包括的其他共享库,因此在其他 linux 发行版上执行此操作不起作用。可能是因为它依赖于安装在系统上的旧共享库,这些库不适用于我复制的内容。

任何人都知道如何让这个工作?这甚至可能吗?

编辑:

澄清一下,期望的结果是创建一个 python 二进制文件和相关包(django、lxml、pysqlite 等)的 tar.gz,可以提取并在任何基于 linux 的系统上运行,即(ubuntu 8.04、redhat 5、suse 11 等),所有 32 位发行版,其中本地安装的 python 版本不会影响 tar.gz 中的内容。

4

6 回答 6

8

我刚刚对此进行了测试,效果很好。

获取要安装的 python 副本并将其解压缩,然后首先将其 cd 到未解压缩的文件夹。

还可以获取 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 系统,它运行完美。

于 2013-09-11T21:44:12.343 回答
7

我不知道这怎么可能。如果是这样,他们就不需要为不同的平台分发 python 的二进制包。您不能简单地分发将在任何平台上运行的 python。它必须从该拱门的源代码构建。Virtualenv 会希望你告诉它使用哪个系统 python(使用链接)。

这几乎适用于任何链接到系统库的二进制包。同样,如果可能的话,我们不需要任何特定于平台的二进制发行版。

但是,您可以实现您想要的部分。也就是说,在另一台没有安装 python 的机器上运行 python,只要它是相同的拱门。这与 freeze 或 py2exe/ py2app /pyinstaller背后的概念相同。解释器被捆绑到一个独立的环境中。因此该应用程序可以在任何类似的平台上运行。

编辑

我刚刚意识到,虽然您的问题与“系统”无关,但您的标题包含参考“linux”。有不同风格的 linux,所以为了让它工作,你必须为多个拱门构建它,并且还完全包含独立链接。您可以尝试使用pyinstaller构建一个包并将其包含在您的项目中。

您可以尝试在您的 virtualenv 中从源代码构建 python:

$ ./configure --prefix=/path/to/virtualenv && make && make install

如果您仍然对库的链接有问题,您还可以调查静态构建它

于 2012-06-28T17:44:19.893 回答
2

我不确定仅在 Python 中工作是否适合这里。使用 Puppet of Chef 可能会更好,它们是可用于创建本地环境的配置工具。有很多代码可以在几乎任何 Linux 和 OSX(可能不是 Windows)上安装 virtualenv 和 python。

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

抱歉,这并不像单独使用 virtualenv 那样简单,但它更加健壮。

于 2012-06-28T18:12:00.297 回答
1

好吧,既然我很少接受“做不到”,那就有办法了。警告:它并不漂亮,您可能应该考虑不同的情况。

您需要确定此顶级目录的标准位置。其次,使用该目录作为您的根目录,您需要在要运行它的每个 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) 将所有这些 tar 到一个可运行的 shell 脚本中来进行安装并避免需要辅助脚本。如果您 gzip 生成的 shell 存档,那么您可以在目标系统上解压缩并执行它以设置所有内容。

说了这么多,我不会推荐这个。我建议确定您可以运行的最低 Python 版本,并确保尽可能由发行版安装,如果需要从 repo 中下载并安装。然后,使用带有 requirements.txt 的 virtualenv 和引导程序将必要的 python 库和应用程序安装到virutalenv 中。为此,请参阅此文档

于 2012-06-30T22:26:58.090 回答
1

我遇到了同样的问题,所以我创建了PortableVirtualenv。你的问题只是它的定义。

我将它用作我开发的商业多平台应用程序的基础。(但 PortableVirtualenv 是公共领域——自由使用。)

如果需要,您可以 pip-install 任何包并压缩整个目录以分发您需要的包。

于 2020-04-02T20:19:09.533 回答
0

一个不错的选择是制作一个“snap”可移植的 linux 应用程序。他们有一个 python 模式,可以让你指定你需要的模块。来自https://snapcraft.io/first-snap#python

Snaps 让您可以在最终用户的应用商店体验中分发依赖隔离的 Python 应用。

另一种选择是使用 docker 之类的东西将您的应用程序容器化。然后,用户实际上不是直接执行您的脚本,而是运行一个只有您的应用程序及其依赖项的小型操作系统。 https://www.infoq.com/articles/docker-executable-images/有更多关于可执行容器的信息。

容器映像也可用于短期进程:一个容器化的可执行文件,旨在在您的计算机上运行。这些容器执行单个任务,寿命很短,通常可以在使用后移除。我们称这些可执行映像。示例包括编译器(Golang)或构建工具(Maven)、演示软件(我喜欢以 Markdown 格式编写一个简单的演示文稿并让RevealJS Docker 映像提供服务)和浏览器(一个新包含的浏览器来跟踪那个可疑的链接)。Docker 自己的Jessie Frazelle是可执行映像的真正传播者。要获得一些很棒的灵感,请务必阅读她关于它们的博客或查看DockerCon 2015上的此演示文稿。

于 2020-01-22T14:44:09.000 回答