![如何设置通过 imp.get_suffixes() 获得的 Python 后缀(特别是在 Debian Jessie 中)?](https://linux22.com/image/67300/%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%E9%80%9A%E8%BF%87%20imp.get_suffixes()%20%E8%8E%B7%E5%BE%97%E7%9A%84%20Python%20%E5%90%8E%E7%BC%80%EF%BC%88%E7%89%B9%E5%88%AB%E6%98%AF%E5%9C%A8%20Debian%20Jessie%20%E4%B8%AD%EF%BC%89%EF%BC%9F.png)
命令
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.7
和debuild -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_DynLoadFiletab
dynload_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'
您必须将其传递到./configure
Python 源目录中。