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)]

しかし、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)だけをパッチするだけで十分です。

おすすめ記事