注文する
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
、ビルドログを見ると(s"x86_64-linux-gnu"
のために引用符があります)。-
値は明らかに次のように見えますが、dpkg-architecture -qDEB_HOST_MULTIARCH
まだ確認していません。
さらに、_PyImport_DynLoadFiletab
これはdynload_shlib.cで最初に見られるものとは異なり、パッチされています。したがって、同じ動作を得るには、少なくともその{"." MULTIARCH ".so", ...}
部分を追加するためにいくつかのパッチを適用する必要があります。私の場合は、このファイル(dynload_shlib.c)だけをパッチするだけで十分です。
答え2
not-system-pythonをDebianのPythonと同じ設定で構成してからコンパイルする必要があります。この情報を「検索」する1つの方法は、システム設定基準寸法。
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ソースディレクトリに渡す必要があります。