9

埋め込みの例を実行しようとしていますが、明示的に追加しない限り、現在の作業ディレクトリからモジュールをロードできませんsys.path

PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append(\".\")"); 

Python は現在のディレクトリでモジュールを探すべきではありませんか?

Edit1 :モジュールをインポートしてみました:

Py_Initialize();
PyRun_SimpleString("import multiply"); 

それでも、次のエラーで失敗します。

Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named multiply

Edit2sys.path ドキュメントから:

スクリプト ディレクトリが利用できない場合 (たとえば、インタプリタが対話的に呼び出された場合、またはスクリプトが標準入力から読み取られた場合)、path[0]は空の文字列であり、Python に現在のディレクトリ内のモジュールを最初に検索するように指示します

not availableの意味がわかりませんが、印刷sys.path[0]すると空ではありません。

/usr/lib/pymodules/python2.7
4

3 に答える 3

19

PySys_SetArgv(int argc, char **argv, int updatepath)相対インポートを機能させるには、呼び出す必要があります。これにより、実行中のスクリプトのパスがsys.pathif updatepathisに追加されます (詳細については、ドキュメント0を参照してください)。

以下はトリックを行う必要があります

#include <Python.h>

int
main(int argc, char *argv[])
{
  Py_SetProgramName(argv[0]);  /* optional but recommended */
  Py_Initialize();
  PySys_SetArgv(argc, argv); // must call this to get sys.argv and relative imports
  PyRun_SimpleString("import os, sys\n"
                     "print sys.argv, \"\\n\".join(sys.path)\n"
                     "print os.getcwd()\n"
                     "import thing\n" // import a relative module
                     "thing.printer()\n");
  Py_Finalize();
  return 0;
}
于 2012-11-16T20:33:26.977 に答える
0

私がpython 3.5でしなければならなかったPySys_SetPathのは、その場所からインポートできるようにすることcwdです:

QString qs = QDir::currentPath();
std::wstring ws = qs.toStdWString();
PySys_SetPath(ws.data());

そのQ中の s は Qt です。

于 2017-01-01T18:57:42.230 に答える
-1

私はまったく同じ問題を抱えていて、Py_Initialize();とを追加するだけで解決しましたPy_Finalize();

それがあなたを助けることができることを願っています

于 2014-11-05T11:03:56.663 に答える