【问题标题】:Having a different LIBDIR path for Python in Linux在 Linux 中为 Python 提供不同的 LIBDIR 路径
【发布时间】:2011-10-07 13:25:41
【问题描述】:

我想改变 Linux 下 Python 2.7 加载其模块/库的方式。我试图从配置文件中更改它。在那之前是这样的:

BINLIBDEST=     $(LIBDIR)/python$(VERSION)
LIBDEST=        $(SCRIPTDIR)/python$(VERSION)
INCLUDEPY=      $(INCLUDEDIR)/python$(VERSION)
CONFINCLUDEPY=  $(CONFINCLUDEDIR)/python$(VERSION)
LIBP=           $(LIBDIR)/python$(VERSION)

我试图把它改成这样:

BINLIBDEST=     $(LIBDIR)
LIBDEST=        $(SCRIPTDIR)
INCLUDEPY=      $(INCLUDEDIR)
CONFINCLUDEPY=  $(CONFINCLUDEDIR)
LIBP=           $(LIBDIR)

主要从路径名中删除 python%(VERSION),这样它就可以仅从 lib 文件夹中加载其模块,而不是 lib/python27。但是,即使启动 ma​​kema​​ke install 可以处理更改,pythonpython27 Python 二进制文件也可以不从新路径加载模块。它回退到这个输出:

Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
'import site' failed; use -v for traceback

是否有办法强制 Python 二进制文件本身(如果必须)从我设置的新路径加载模块,而不是默认路径为 "$(LIBDIR )/python$(版本)"?

【问题讨论】:

  • 我不知道你想通过摆脱路径中的 python$(VERSION) 来达到什么目的,但在我看来这是一个糟糕的主意,如果你尝试安装它会变得更糟python3 沿着你的 python2 安装。
  • 这可能是真的,但主要想法不是与系统范围的 Python 一起工作,而是拥有一个单独的、更可移植的 Python 版本,以拥有自己的库和模块,而不是,如前所述,影响系统范围的 Python 中的任何东西或触及任何东西。
  • 我明白了。无论如何,根据文档:“默认情况下,在 prefix/lib/pythonversion 和 exec_prefix/lib/pythonversion 中搜索库”。所以可能你能做的最好的事情就是改变前缀,而不是后缀。考虑将其安装到/opt/ 目录。您可能还必须将$PYTHONHOME 变量设置为/opt/,如错误消息中所述。

标签: python linux configure


【解决方案1】:

您必须对 python 源代码进行一些更改并重新编译,但我认为这没问题,因为这是一件非常不标准的事情。

查看文件Modules/getpath.c。 python 执行以确定 libdir 的步骤在文件开头的 cmets 中有详细说明。你可以看看 svn repo here。我想你会想看看这个定义是如何使用的:

#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
          EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"

我认为这不会像将其更改为 [...] PREFIX "/lib/:" [...] 那样简单,但它会是这样的。

【讨论】:

    【解决方案2】:

    您是否正在尝试完成 virtualenv 不做的事情?

    看来符合你的要求:

    "...主要思想不是使用系统范围的 Python,而是 有一个单独的、更便携的 Python 版本来拥有自己的 库和模块..”

    【讨论】:

    • 我不认为你可以在闪存驱动器上做 virtualenv,除非它是 ext3 格式的......
    • @Starbright 没有提到闪存驱动器,但如果这是要求,则有一个具体问题:stackoverflow.com/questions/7798704 为什么它必须是 ext3?
    • 不是特别是 ext3 - 但它不能是 FAT32,这通常是默认值 - 你不能在 virtualenv 需要的 FAT32 上创建符号链接。问我怎么知道的 ;)
    【解决方案3】:

    我要感谢 carlpett:我能够在运行时设置 python 搜索路径:在构建 Python 2.7.10 时从 lib/ 更改为 lib64/ x86_64-my_distro-gnu-linux 通过修改 Modules/getpath.c 使用 gcc 5.1。

    作为记录,我在配置时尝试了 --libdir(适用于共享库,但不适用于 python 模块安装路径),修改 Makefile,修改 pyconfig.h,调整 $PYTHONPATH,$PYTHONHOME,没有任何效果。

    只是一个细节,但是 make install 没有正确放置库,所以你必须自己做一点 cp -af 和 mv 。

    谢谢卡佩特!!!

    【讨论】:

    • 这是您唯一需要更改的文件吗?几个“多库”风格的补丁(用于旧版本的 Python-2.x.x)在大约 6 或 7 个文件中进行了更改,包括 Modules/getpath.c。如果只需更改 Modules/getpath.c 就可以完成,我很想知道 - 我现在在 /opt/Python/Python-{2.7.9,3.4.3}-{32,64} 有 4 个 python 安装,任何需要 Python 的东西总是一个巨大的皮塔来安装/工作(因为我也不想要一个不存在的/usr/lib 中的 64 位库@)
    • 嗨,克里斯!没错,我检查了我的笔记,还有另一个文件要更改:在编译时:Modules/Setup(zlib 和 SSL 部分),在运行时:sysconfig.py 模块(以适应模块搜索,不确定是否它与库有关..)。
    猜你喜欢
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多