7

次の行を使用して

pModule = PyImport_Import(pName);

現在のディレクトリからのみモジュールをロードします。

しかし、どこかから何をロードしたいですか? そうするためのきちんとした方法はありますか?

PyRun_SimpleString("import sys\nsys.path.append('<dir>')"); 動作しますが、少し醜いです - より良い方法を探しています

ありがとう!

4

2 に答える 2

15

私が探していた答えがhttp://realmike.org/blog/2012/07/08/embedding-python-tutorial-part-1/で見つかりました

通常、モジュールをインポートするとき、Python はインポートするモジュール (インポート ステートメントを含むモジュール) の隣にあるモジュール ファイルを見つけようとします。次に、Python は「sys.path」内のディレクトリを試行します。通常、現在の作業ディレクトリは考慮されません。私たちの場合、インポートは API を介して実行されるため、Python が「shout_filter.py」を検索できるディレクトリを持つインポート モジュールはありません。プラグインも「sys.path」にありません。Python がプラグインを見つけられるようにする 1 つの方法は、API を介して「sys.path.append('.')」と同等の処理を実行して、現在の作業ディレクトリをモジュール検索パスに追加することです。

Py_Initialize();
PyObject* sysPath = PySys_GetObject((char*)"path");
PyObject* programName = PyString_FromString(SplitFilename(argv[1]).c_str());
PyList_Append(sysPath, programName);
Py_DECREF(programName);

SplitFilenameディレクトリを取得するために私が書いた関数です。

于 2014-01-22T12:54:30.830 に答える
-1

これはサイトパックでよく行われる方法なので、良い方法があります。

import sys
sys.path.append(directory) # sys.path is a list of all directories to import from

またはあなたが使用する

os.cwd(directory) # change the working directory

輸入前。

別の方法は醜いです:

import types, sys
m = types.ModuleType('module')
sys.modules['module'] = m
exec open('file').read() in m.__dict__ # python3

多分あなたはあなたの仕事をするためにC関数を求めましたが、私は知りません。

于 2014-01-22T10:24:19.013 に答える