在Linux中创建系统无关的最小Python环境

2 投票
1 回答
1584 浏览
提问于 2025-04-16 10:57

我的目的是尝试编译一个完全可移植的Linux Python最小基础版本,这个版本和系统无关(也就是说,它根本不和系统中安装的Python版本有任何交互)。

在Windows上,这个过程相对简单,只需要Python的二进制文件和一套最小但自定义的模块,这些模块会被这个可移植的Python基础加载。

然而,在Linux上实现这个目标对我来说就比较困难,因为从头编译Python时,它仍然会从系统中加载模块(比如说从/usr/lib/python2.6),而不是从它自己的Lib子目录加载,这样一来,一旦我把这个Python基础移动到其他地方,就找不到模块了。

如果可能的话,有没有办法编译出一个可以在更多Linux发行版上运行的'python',而不仅仅是在我编译的那个发行版上?

补充说明:实际上,问题出现在我尝试把python2.6(或者只是python)移动到已经设置好的Python基础中时(这个基础在Windows上运行正常),但它输出了
找不到平台独立的库 <prefix>
找不到平台相关的库 <exec_prefix>
考虑在Linux下将$PYTHONHOME设置为 <prefix>[:<exec_prefix>]

根据我的理解,这可能和LIBDIR设置为(exec_prefix)/lib/python$(VERSION)有关,而不是我最近设置的(exec_prefix)/lib

有没有办法定义要从哪些文件夹和文件读取,而不是使用默认的那些?Makefile处理得很好(make和make install会把它放到正确的lib文件夹里)。但是当使用farfromhome的print pth方法时,它仍然倾向于从/home/arnold/Python/lib/python2.6加载,而不是/home/arnold/Python/lib

有没有办法强制python加载自定义的LIBDIR路径,而不是默认的路径?

注意:这个安装的文件和文件夹结构与标准的Linux或Windows Python安装是不同的。

1 个回答

2

你提到的使用 --prefix 的方法确实有效。我用 --prefix=/usr/local 编译了 Python 2.7.1,运行生成的程序后得到了:

Python 2.7.1 (r271:86832, Jan 31 2011, 11:06:01) 
[GCC 4.5.1 20100924 (Red Hat 4.5.1-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> for pth in sys.path:
...     print pth
... 

/usr/local/lib/python27.zip
/usr/local/lib/python2.7
/usr/local/lib/python2.7/plat-linux2
/usr/local/lib/python2.7/lib-tk
/usr/local/lib/python2.7/lib-old
/usr/local/lib/python2.7/lib-dynload
/usr/local/lib/python2.7/site-packages

注意,这里没有任何关于 /usr/lib 的引用,只有 /usr/local/lib。而且这完全是我在编译或之后没有做任何其他操作的情况下得到的结果。

撰写回答