4

私は現在、IronPython をテストしています (C# と CPython を少し知っています)。ここで、カスタム クラスを Python スクリプトで使用したいと考えています。

次のプロジェクト構造があります。

Solution IPTest
---Project IPTest
------Namespace IPTest
---------Program class (main)
---------Elem class
------Scripts
---------Worker.py

Elem は単純です:

public class Elem {
    public string Name;
}

次のような問題なく、.NET プログラムで Python スクリプトを使用できます。

ScriptEngine engine = Python.CreateEngine();
ScriptSource source = engine.CreateScriptSourceFromFile("./Scripts/Worker.py");
ScriptScope scope = engine.CreateScope();
source.Execute(scope);
// or var worker = Python.CreateRuntime().UseFile("./Scripts/Worker.py");
dynamic Worker = scope.GetVariable("Worker");
dynamic worker = Worker();
var res1 = worker.add(4, 5);

ただし、Python スクリプトでホスト アセンブリを参照する方法がわかりません。いくつかの調査の後、次のことを試しました。

import sys
import System
sys.path.append(System.IO.Directory.GetCurrentDirectory()) #make sure assembly dir is  in sys.path
import clr
clr.AddReference(“IPTest.exe”)
# or clr.AddReferenceToFile(r"IPTest.exe")
# or clr.AddReference(r"<fullpath>\IPTest\bin\Debug\IPTest.exe")
# or clr.AddReference(“../IPTest.exe”) #when not adding workingdir to sys.path
from IPTest import Elem
# or from IPTest.IPTest import Elem
# or import Elem

どちらも機能しません。次の 2 つの異なるエラー メッセージが表示されます。

  1. workingdir を sys.path に追加するか、相対パスを使用するか、AddReferenceToFile を使用する場合: IPTest という名前のモジュールはありません
  2. 絶対パスを使用する場合: 指定されたアセンブリ名またはコードベースが無効でした。(HRESULT からの例外: 0x80131047)

アセンブリ名が本当に IPTest であることを確認し、exe の代わりに dll を使用しようとしましたが、通常は違いはなく、驚くべきことにどちらも機能しません。

免責事項:ここに記載されている解決策:

engine.Runtime.LoadAssembly(Assembly.GetExecutingAssembly()); //in c#
from IPTest import Elem # in python script

うまく動作します。ただし、スクリプトファイルを参照することでも機能するはずです(これはより良いでしょう)。

おそらく明らかな何かが欠けていますが、それが見えないだけなので、ヒントをいただければ幸いです。

4

1 に答える 1

3

clr.AddReferenceToFile(r'IPTest.exe')エラーに記載されているように試してください:

  1. workingdir を sys.path に追加するか、相対パスを使用するか、AddReferenceToFile を使用する場合: IPTest という名前のモジュールはありません
于 2012-09-28T16:23:44.040 に答える