如何设置通过 imp.get_suffixes() 获得的 Python 后缀(特别是在 Debian Jessie 中)?

如何设置通过 imp.get_suffixes() 获得的 Python 后缀(特别是在 Debian Jessie 中)?

命令

python -c "import imp; print(imp.get_suffixes())"

打印带有导入模块时使用的后缀的元组列表(请参阅imp.get_suffixes 的文档)。通常它很简单:

[('.so', 'rb', 3), ('module.so', 'rb', 3), ('.py', 'U', 1), ('.pyc', 'rb', 2)]

然而,在 Debian jessie 上,还有另一个后缀:

[('.x86_64-linux-gnu.so', 'rb', 3), ('.so', 'rb', 3), ('module.so', 'rb', 3), ('.py', 'U', 1), ('.pyc', 'rb', 2)]

有些扩展名带有后缀.x86_64-linux-gnu.so,例如/usr/lib/python2.7/dist-packages/paraview/vtkCommonCorePython.x86_64-linux-gnu.so.

我想将具有此后缀的扩展与不是系统Python且我自己构建的Python一起使用,但它不起作用,因为此Python没有后缀.x86_64-linux-gnu.so

所以我想知道如何添加这个后缀。好像没有类似的功能imp.add_suffix。我怀疑它是在 Python 构建过程中完成的,但我想知道如何...我查看了 Debian Python 包的源代码,但它并不简单,我没有设法了解它是如何工作的...

答案1

刚刚遇到同样的问题。使用该线程中提供的信息,我能够走得更远。

我使用apt source python2.7debuild -b -uc -us详细检查了官方包是如何构建的。的实现imp.get_suffixes()位于 Python/import.c:2940 imp_get_suffixes(...),它从名为 的列表中读取后缀_PyImport_Filetab。这个列表基本上是_PyImport_DynLoadFiletab串联_PyImport_StandardFiletab的。

很明显,这_PyImport_DynLoadFiletab就是我们应该寻找的内容,并且它的定义因不同平台而异 - 它们位于 Python/dynload_*.c 中。在 Python/dynload_shlib.c 中是:

const struct filedescr _PyImport_DynLoadFiletab[] = {
#ifdef __CYGWIN__
    {".dll", "rb", C_EXTENSION},
    {"module.dll", "rb", C_EXTENSION},
#else
#if defined(PYOS_OS2) && defined(PYCC_GCC)
    {".pyd", "rb", C_EXTENSION},
    {".dll", "rb", C_EXTENSION},
#else
#ifdef __VMS
    {".exe", "rb", C_EXTENSION},
    {".EXE", "rb", C_EXTENSION},
    {"module.exe", "rb", C_EXTENSION},
    {"MODULE.EXE", "rb", C_EXTENSION},
#else
#ifdef Py_DEBUG
    {"_d.so", "rb", C_EXTENSION},
    {"module_d.so", "rb", C_EXTENSION},
# ifdef MULTIARCH
    {"." MULTIARCH "_d.so", "rb", C_EXTENSION},
# endif
#endif
#ifdef MULTIARCH
    {"." MULTIARCH ".so", "rb", C_EXTENSION},
#endif
    {".so", "rb", C_EXTENSION},
    {"module.so", "rb", C_EXTENSION},
#endif
#endif
#endif
    {0, 0}
};

它就在那里:MULTIARCH,如果你查看构建日志,就是"x86_64-linux-gnu"(带引号,因为有-s)。该值显然来自dpkg-architecture -qDEB_HOST_MULTIARCH但我尚未验证。

更重要的是,_PyImport_DynLoadFiletabdynload_shlib.c 中最初看起来并不是这样,它已被修补。因此,要获得相同的行为,还必须应用一些补丁,至少添加该{"." MULTIARCH ".so", ...}部分。就我而言,单独修补此文件(dynload_shlib.c)似乎就足够了。

答案2

您应该在使用与 Debian 的 python 相同的设置配置后编译 not-system-python。 “检索”此信息的一种方法是从系统配置模块。

python -c "import sysconfig; print(sysconfig.get_config_vars()['CONFIG_ARGS'])"

给你类似的东西:

'--enable-shared' '--prefix=/usr' '--enable-ipv6' '--enable-unicode=ucs4' '--with-dbmliborder=bdb:gdbm' '--with-system-expat' '--with-system-ffi' '--with-fpectl' 'CC=x86_64-linux-gnu-gcc' 'CFLAGS=-D_FORTIFY_SOURCE=2 -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security ' 'LDFLAGS=-Wl,-Bsymbolic-functions -Wl,-z,relro'

您必须将其传递到./configurePython 源目录中。

相关内容