0

ファイル__init__.pyが原因で Python インタープリターがモジュールのサブディレクトリを検索するのはなぜですか? また、C++ から呼び出されたときにインタープリターがこの規則を尊重しないのはなぜですか?

私が知っていることは次のとおりです。

私のプログラムで strace を使用すると、同じ python2.5 インタープリターが対話型ケースと C++ 呼び出しの両方で実行されていることがわかります。

どちらの場合も、PYTHONPATH は問題のインポートされたモジュール (matplotlib) の検索を指示します。これは一連の open() 呼び出しとして表示され、現在の作業ディレクトリから始まり、PYTHONPATH (ここでは/opt/epd/lib/python2.5/site-packages) に拡張され、最後にサブディレクトリに拡張されます (作業の場合)。

完全な開示は、私が「Enthought」ディストリビューションを使用しており、__init__.pyファイルをsite-packagesディレクトリに配置し、その site-packagesディレクトリを PYTHONPATH に配置して作業ケースを作成する必要があったことです。

コードは以下です。__init__要求されたパッケージを見つけるために、Python インタープリターを検索および/または再帰するように構成するための呼び出しを行う必要があるようです。もしそうなら、どのように??

PyObject* main_module, * global_dict, * expression, *args, *spec;

Py_Initialize ();

char* script = "abc.py";
PySys_SetArgv(1, &script);

//Open the file containing the python modules we want to run
FILE* file_1 = fopen("abc.py", "r");
if (file_1 == 0) fprintf(stdout, "ERROR: File not opened");

//Loads the python file into the interpreter
PyRun_SimpleFile(file_1, "abc.py");

//Creates a python object that contains references to the functions and classes in abc.py 
main_module = PyImport_AddModule("__main__");
global_dict = PyModule_GetDict(main_module);

expression = PyDict_GetItemString(global_dict, "view_gui");
spec       = PyObject_CallObject(expression, NULL);

PyObject_CallMethod(spec, "shutdown", NULL);
Py_Finalize();

return NULL;

Python スクリプトが C++ から呼び出されると、ファイル/opt/epd/lib/python2.5/site-packages/matplotlib(またはそのバリアント、matplotlib.so など) が見つからないときに検索が停止するようです。

PYTHONPATH を拡張して、matplotlib (およびその他の必要なパッケージ) の正確な場所を含めることができることに注意してください。ただし、 import へのパスを含めることはできないようですmatplotlib.cbook

4

1 に答える 1

0

(別のバージョンの) python を見ると、 の一部である が含まれimport.cていることがわかります。が実行されない、または失敗する理由が不明です。find_init_module()find_module()find_init_module()

于 2009-10-28T18:21:04.753 に答える