2011-12-22 5 views
6

sys.pathが拡張された後にのみ、 "import some_module" をPythonインタプリタから呼び出して、zipファイルからPythonモジュール(.py、.pyc、.pyd) zipファイル を含むようにして、私は埋め込みPythonのzipからpydファイルをロードする

import zipextimporter 
zipextimporter.install() 

を実行した後にのみ、後者は.pydモジュールに必要です。

また、PythonのPython .pyと.pycモジュールをC++に埋め込まれたPythonから読み込むこともできます。しかし、また、組み込みのPythonからモジュールを.pydロードするために、私はエラーなしでこの線を越え

PyRun_SimpleString("import zipextimporter"); 

C++ exeファイルの実行を追加しました。しかし、次のコマンド

PyRun_SimpleString("zipextimporter.install()"); 

は私に、このエラーを与える:

enter image description here

なぜPythonのが埋め込まれzipextimporter.install()がクラッシュしていますか?

どうすればこの問題を解決できますか?

おそらくC++コード のコンパイル方法と関係がありますか?私はG ++を使用します。私はそれが解決策を提供することができ、リンク How to link against msvcr90.dll with mingw gcc?

を見た

g++ embed-simple.cpp -IE:\Python27\include -LE:\Python27\libs -lpython27 -o embed-simple

? 私はgcc - > g ++をどのように調整すればいいですか?CではなくC++コードを実行しているので、

私はWinXPでPython 2.7.2を実行しています。私はきれいなのPython 2.7.2をインストールした後、ランタイムエラーを取得しない

、ちょうどこの:

Import Error: No module named....

それが埋め込んC++スクリプトがコンパイルされた方法は関係ありますか?私はg ++を使いました。私は もインテルコンパイラでコンパイルしましたが、同じランタイムエラーが発生しました。多分私はMS Visual C++を試してみるべきです。

またはctypesを使用してpydをインポートしますか?

+0

私はPyCryptoをインポートしようとしています。組み込みバージョンを使用すると、同じエラーが発生します。これを払う。 – Chiguireitor

答えて

4

PYDファイルは、拡張子が変更されたネイティブDLLファイルです。それらをロードするには、オペレーティングシステムの機能とオペレーティングシステムの制限が必要です。

Windows XP、または私が知る限り、どのOSでもZIPファイルからDLLファイルをロードできないため、ZIPファイルからPYDファイルをロードすることはできません。

+1

あなたの答えは間違っているようです。 WinXP上のPythonインタープリタからは動作しますが、WinXP上のPythonには組み込まれていません。 –

+0

Hmmm。私は間違っている必要があります:(しかし、それはおそらく問題の原因です... DLLの読み込みは、EXEと同じディレクトリからDLLファイルをロードするようなOS固有の規則を守ります。 "何らかの理由でうまくいく" sys.pathを修正する代わりに、WindowsにDLLをロードするヒントを与えるos.environ ["PATH"]を試してみてください。 –

+0

いいえチェックしました。これはPythonインタプリタ私はsys.pathにzipを含めるように調整した後に –

2

memimporter.pyd(zipextimporterの中にある)のためにコンパイルされたPythonのバージョンはどれですか? Pythonインタプリタとpydが一致しない場合は、恐ろしいクラッシュが発生します。

私はmemインポータコードがどこにあるのか分かりませんが、推測すると、ジップベースのpydインポートを検出し、pydを一時的な場所に抽出して呼び出すインポートフックを挿入することだと思いますそれに対するPythonインタプリタの標準インポート。

+0

これはコードだと思う:http://src.chromium.org/svn/trunk/tools/third_party/python_26/Lib/site-packages/zipextimporter.pyしかし私はどのバージョンのPython memimporterがコンパイルされているか確かめてください。 –

+0

どこからダウンロードしましたか?彼らは通常、ダウンロードリンク上または近くにあなたに教えてくれます。例えば、 –

+0

しかし、 "import _ memimporter "をPythonインタプリタから削除します。しかし、私の場合はpy2exeによって生成されたzipextimporter.pycがzip内から取り込まれる可能性があります。私は、sys.pathを調整して、最初の部分ではなく最後にzipを入れてみました。つまり、PyRun_SimpleString( "sys.path.insert(-1、\"。\\ python27.zip \ ")"); PyRun_SimpleString( "sys.path.insert(0、\"。\\ python27.zip \ ")")の代わりに。しかしそれは違いをもたらさなかった。 –

5

memimporterとzipextimporterは実際に.pydファイルをメモリ/ zipアーカイブからファイルに展開することなくロードできます。

ランタイムエラーR6034は、VC9ランタイムライブラリをマニフェスト経由でロードする必要があることが原因です。異なるCランタイムを使用するPython 2.5でコードを実行すると、おそらく成功するでしょう。 VC9ランタイムライブラリを参照しているマニフェストをexeに埋め込む必要があります。多分py2exeのwikiがいくつかのガイダンスを提供します。

+0

ありがとうございます。これは、Visual Studioで埋め込みC++コードをコンパイルすると、Visual Studioがデフォルトでマニフェストを埋め込もうとしているので、おそらく動作するのでしょうか? –

+0

私は知りません(私はC/C++プログラムをもう書きません;-) – theller

+0

私はまだ混乱しています。 zipextimporter.pycがzip内にある場合、_memimporterもzip内にあります。しかし、後者は.pydファイルです。これは、zip内からpydファイルを読み込むツールを探しているためです。 –

2

これは私がpy2exeでアプリケーションをコンパイルしようとしていたのと同じ種類の問題のようです。ここをクリックしてください: http://www.py2exe.org/index.cgi/Tutorial、セクション5.2を見てください。同じことが起こります...初めてmemimporterを使用しようとすると、同様のエラーメッセージでクラッシュします。基本的には、Python 2.6+では、パスにランタイムライブラリの正確なバージョンとそれを指すマニフェストが必要です。あなたは埋め込まれたPythonを使用しているので、私はそれがすべてどのように動作するのかわかりませんが、おそらくそれはあなたを近づけるでしょう。

ランタイムDLLの正しいバージョンをどこかに置き、Pythonコードでzipextimporterをインポートする前に、正しいランタイムのパスをsys.pathに追加し、それが修正されているかどうか確認してください。あなたがそこに埋め込まれたpythonのためのマニフェストを得る方法を確信していない。親アプリのマニフェストに含める必要があるかもしれません。

編集:BTW、私は忘れて、この問題の周りに別の方法を見つけました。正確な詳細は忘れてしまいますが、あなたのアプリはデフォルトのバージョンのランタイムを読み込み、Pythonはそのバージョンを尋ねて、c:\ python {26,27}にあるものを探して一致しません。この問題を解決する最も簡単な方法は、c:\ python \ msvcr90.dllを削除することです。その後、Pythonはアプリケーションのマニフェストで動作しないかもしれないdllのローカル(旧)バージョンにヒットせず、両方とも出て、Windowsディレクトリから現在のバージョンを取得しなければなりません。

関連する問題