4

Python で *.pyd を読み込もうとしていますが、よく知られている「インポート エラー: DLL の読み込みに失敗しました: 指定されたプロシージャが見つかりません」というメッセージが表示されます。エラー。

私はすでに次のことを行っています:

1.) Dependency Walker で *.pyd を調査しました。GPSVC.DLL と IESHIMS.DLL が見つかりませんでしたが、遅延がロードされました。IEFRAME.DLL もエクスポートが見つからず、遅延ロードされました。これらは使用されておらず、とにかく遅延ロードであるため、問題にはならないはずです。

2.) ProcMon を監視しながら、Python コマンド ウィンドウで foo.pyd に対して "import foo" を実行しました。ProcMon は、"foo.pyd" でイベント "LoadImage" を示し、結果は SUCCESS です。

これは、*.pyd ファイルが正しく読み込まれたことを示しているようです。

それで、私は何が欠けていますか。私のWindows診断はすべてがうまくいっていると言っていますが、pythonは物をロードできないと言っています(通常、dllまたはシンボルが見つからないためです)。

アイデア?

ありがとう!

4

3 に答える 3

4

使用している Python の同じバージョンの .pyd ファイルですか? 間違った Python バージョンの .pyd ファイルをロードすると、そのエラー メッセージが表示される場合があります。

Dependency Walker は、リンク先の pythonNN.dll を表示できます。

于 2011-04-14T20:07:42.927 に答える
1

ここに答えがあります:

Windows 診断 (依存、procmon など) は、DLL (または pyd) の読み込みが正常であることを示していました。

Python は、正常にロードされていないことを示していました。

Windows ツールが C:\Window\SysWOW64 フォルダーに隠れている別の Python26.dll を参照していることがわかりました。

この 2 番目の Python26.dll (SysWOW64 にあります) には、プライマリ python26.dll (Windows python インストーラーによってインストールされ、C:\Python26 にあります) にないシンボルがあります。

このシンボル「_PyByteArray_empty_string」は、私の *.pyd ファイルで明らかに必要でした。

そのため、Windows 診断を介してロードすると、SysWOW64 dll が見つかり、*.pyd が適切にロードされました。Python からロードすると、C:\Python26\ の dll が見つかり、シンボルが見つからず、ロードに失敗しました。

それが問題が明らかになった理由です。問題は、Python26.dll の 2 つのバージョン (_PyByteArray_empty_string を含むバージョンと含まないバージョン) がなぜ出回っているのかということです。

Python 2.6.6 を使用しています。おそらく、このシンボルは 2.6.6 では削除されていますが、古い 2.6.x リリースには存在しますか?

于 2011-04-16T14:21:47.620 に答える
1

ファイル がある場合foo.pyd、 forimport fooが成功するには、外部からアクセス可能な という名前の関数が必要 initfooです。Dependency Walker は、存在する場合、これ (通常は唯一の関数) を表示します。モジュールinitfooを初期化するために Python によって呼び出される必要があります。foo

注: これが問題である場合は、より明確なエラー メッセージが表示されると思います。

>>> import fubar
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define init function (initfubar)
>>>

あなたは「*.pyd ファイルをロードしようとしている」と言います。それは単なる奇妙な記述方法import fooですか、それとも何か他のものですか?

pydを作成しましたか?そうでない場合、誰がしたのですか?あなたは彼らに尋ねましたか?この pyd はウェブ上で利用できるので、他の人がロード/インポートを試みることができますか?

于 2011-04-14T23:29:30.443 に答える