4

私は単純な(?)埋め込みPythonプロジェクトに取り組んでいます。'setup.py install'を使用してsite-packagesにインストールされたカスタムパッケージがあります。例:

C:\ Python27 \ Lib \ site-packages \内:

mypackage\
    __init__.py
    subpackage\
        __init__.py
        subpackage.py
    .... 
    mymodule.py

いくつかの単純な埋め込み呼び出しを実行するだけで、Pythonを実行しているcmdウィンドウで取得したものと一致しない動作が発生します。具体的には:

PyRun_SimpleString("import mypackage") //Success (return == 0)
PyRun_SimpleString("from mypackage import subpackage") //Success
PyRun_SimpleString("from mypackage import mymodule") //Fail (return == -1)

...これらはすべてcmdウィンドウで正常に機能します(ImportErrorはありません。たとえば、期待される結果を得ることができます。dir(mymodule)

結果として得られるインタープリターPy_Initialize()は、cmdウィンドウで取得するものとは少し異なることを認識しています。特に、sys.path ...他の回答をいくつか読んだので、sysの最初の要素として''を挿入してみました。 .path: PyRun_SimpleString("import sys\nsys.path.insert(0,'')")インポートが失敗する前ですが、運がない場合でも-1を返します。また、sys.pathに「C:\ Python27 \ Lib \ site-packages \ mypackage」を追加しようとしましたが、「mymodule」(mymodule.py)をインポートできませんでした。

SOや他のサイトの他の例に基づいて、インポート時にいくつかのバリエーションを試しました。

__import__('mypackage',globals(), locals(), fromlist=['mymodule'])
__import__('mypackage.mymodule',globals(), locals(), fromlist=['mymodule'])

またPyImport_ImportModuleEx、PyRun_SimpleStringと同様に、「frommypackageimportmymodule」以外のすべてで機能しました。

さらに、このシナリオはMacOS /Python2.7で問題なく機能します。失敗しているのはWindowsのすぐ下です。

これが軌道に乗らない可能性があるアイデアはありますか?

更新:いくつかの追加情報:'subpackage.py'は拡張ライブラリをインポートします('utilites.pyd'と呼びましょう)。これをインポートしない他の「.py」モジュールをインポートすることができます。

4

1 に答える 1

0

私自身の質問に答えるまれな機会を利用して...

問題を utility.pyd 拡張機能をインポートしているモジュールに絞り込んだ後、Dependency Walker ツールを調べてみたところ、MSVCR90.DLL (ファイルが見つかりません) の読み込み中にエラーが発生したことがわかりました。昔は、その DLL をアプリケーションのパスにドロップするだけで、通常は機能していました。

しかし、最近 (Vista 以降) では、もう少し複雑になっています。古い MSVCR DLL に関するこの興味深いブログ投稿を読んだ後<dependency>、.pyd ファイルのマニフェストのセクションを更新して、\Windows\WinSxS に存在する Python27.DLL と同じ MSVCR90.DLL を指すようにしようと考えました (サイド-by-side) フォルダ。

その後、それは魅力のように機能しました。次に、依存関係セクションを自動的に含める方法を理解する必要がありますpython setup.py mypackageが、それは別の問題です:-)

于 2012-04-18T20:56:12.443 に答える