8

は空sys.pathでインタプリタを初期化しようとCPythonのプログラムです:上記のプログラムを実行するPython 3.5インタプリタを実行するために必要な標準ライブラリモジュールはどれですか?ここ

#include <Python.h> 

int main(int argc, char** argv) 
{ 
    wchar_t* program = NULL; 
    wchar_t* sys_path = NULL; 

    Py_NoSiteFlag = 1; 

    program = Py_DecodeLocale(argv[0], NULL); 
    Py_SetProgramName(program); 

    sys_path = Py_DecodeLocale("", NULL); 
    Py_SetPath(sys_path); 

    Py_Initialize(); 

    PyMem_RawFree(program);  
    PyMem_RawFree(sys_path); 
    Py_Finalize(); 
} 

は、次のエラーが発生します。

Fatal Python error: Py_Initialize: Unable to get the locale encoding 
ImportError: No module named 'encodings' 

Current thread 0x00007ffff7fc6700 (most recent call first): 
Signal: SIGABRT (Aborted) 

だから、Pythonでのパッケージとモジュールの3.5標準ライブラリは、encodingsパッケージのほかに、Python 3.5インタプリタを実行するために絶対に必要ですか?この情報は私には書類に欠けているようです。

+0

インタプリタを実行し、インポートされたモジュールの辞書を調べて、その内容を確認することができます。 –

答えて

6

これらは、インタプリタの起動時に使用されるパッケージ/モジュールです(@Charles Duffyがコメントに記入したように、sys.modulesを参照)。

結果は、siteが有効かどうかによって異なります(Py_NoSiteFlag = 1;はこれに該当しないことを意味しますが、とにかく、両方のオプションを指定します:-))。

siteあなたは_sitebuiltinsstatのようにそれを使用する場合、合計であなただけの次使ってPythonを実行することができ、それに追加のモジュールのカップルドラッグ:site無効と

abc.py    encodings  os.py   _sitebuiltins.py sysconfig.py 
codecs.py   genericpath.py posixpath.py site.py   _collections_abc.py 
io.py    stat.py   _weakrefset.py 

を、あなたがにストリップダウンしています6

(あなたのコメントに基づいて、またはWindowsを通して) Py_Initialize()Cを通じて呼び出さ
abc.py codecs.py encodings io.py os.py _weakrefset.py 

Iおそらくos.pyと推測されるかもしれません。

+0

* build *とはどういう意味ですか?私は、 'encodings'パッケージと、' sys.path'に '_weakrefset'、' abc'、 'codecs'、' io'モジュールを入れてインタープリタを走らせることができました。 – Jovito

+0

これはあまり効果がありませんが、まだまだです。 – Jovito

+0

ああ、私はあなたがプロセス全体(つまり、CPythonのソースを取得し、ビルドしてから実行していること)を意味していると思っていました。はい、単純にインタプリタを実行するには、私がリストしたモジュール/パッケージの小さなサブセットが必要です。あなたが必要なモジュールを見つけたので、私はあなた自身の質問に答えてくれたと思います:-) @Jovito –

1

チャールズ・ダフィーがコメントで示唆したようにインタープリタを実行すると、readlineのようなパッケージがロードされます。私はこれを行ってから10年が経ちましたが、IIRCでは、コマンドラインの対話がないので、PythonをCプログラムの拡張として使用する場合、そのモジュールは必要ありません。他のモジュールでも同じことが言えるでしょう。

実際に必要なものを判断する最も簡単な方法は、プログラムが見つかる場所のlib/python3.5をすべて入れて、sys.modulesを印刷することです。 プログラムが実際にロードされたもののリストを提供します。インタープリタが起動する必要はありません。その後、そのリストにないものはすべて削除します。

1

ここでは別のアプローチだ - モジュールがロードされているものをPythonインタプリタを求めて:

$ python3.5 -v -S -c '' |& grep SourceFileLoader | sort 
import 'abc' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d12e860> 
import '_bootlocale' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d1367b8> 
import 'codecs' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d187fd0> 
import 'encodings.aliases' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d11eac8> 
import 'encodings' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d187be0> 
import 'encodings.latin_1' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d12e3c8> 
import 'encodings.utf_8' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d12c898> 
import 'io' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d12e5f8> 
import '_weakrefset' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d135080> 

_bootlocale必要ですが推奨されていませんが。 sys.stdin/sys.stdout/sys.stderrの最適なエンコーディングを初期化するために使用されます。 https://hg.python.org/cpython/rev/fbbf8b160e8d

sys.modulesは変更可能です。

関連する問題