주문하다
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'
이를 ./configure
Python 소스 디렉터리에 전달해야 합니다.