imp.get_suffixes()(특히 Debian Jessie에서)를 통해 얻은 Python 접미사를 설정하는 방법은 무엇입니까?

imp.get_suffixes()(특히 Debian Jessie에서)를 통해 얻은 Python 접미사를 설정하는 방법은 무엇입니까?

주문하다

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

모듈을 가져올 때 사용된 접미사와 함께 튜플 목록을 인쇄합니다(참조imp.get_suffixes에 대한 문서). 일반적으로 간단합니다.

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

그러나 데비안 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, 빌드 로그를 보면 ( s "x86_64-linux-gnu"때문에 따옴표가 있음 )입니다. -값은 분명히 다음에서 나온 것 같지만 dpkg-architecture -qDEB_HOST_MULTIARCH아직 확인하지 않았습니다.

게다가 _PyImport_DynLoadFiletab이것은 dynload_shlib.c에서 원래 보이는 것과 다르며 패치되었습니다. 따라서 동일한 동작을 얻으려면 최소한 해당 {"." MULTIARCH ".so", ...}부분을 추가하기 위해 일부 패치도 적용해야 합니다. 제 경우에는 이 파일(dynload_shlib.c)만 패치하면 충분할 것 같습니다.

답변2

not-system-python을 데비안의 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 소스 디렉터리에 전달해야 합니다.

관련 정보