2

StackOverflow を検索しましたが、問題の解決策が見つかりませんでした。Iron Python 2.7.3 DLR Hosting API を使用しています。私がやろうとしているのは、C# コードから純粋な python スクリプトの python 関数を呼び出すことです。hereから例を挙げましたが、この単純なコードは魅力的です。しかし、私のユースケースはもう少し複雑で、私の python モジュールでは、非標準のパッケージとモジュールのインポートを行っています。

MyModule.py

import sys
sys.path.append(r"C:\Program Files (x86)\IronPython 2.7")
sys.path.append(r"C:\Program Files (x86)\IronPython 2.7\Lib")
sys.path.append(r"C:\Program Files (x86)\IronPython 2.7\Lib\lib2to3")

import os
import clr

sys.path.append(r'C:\MyPythonCodeLocation')
# mypackage are located at C:\MyPythonCodeLocation
import mypackage

def foo(p):
    print '{0}: module - {1}, package - {2}'.format(p,__name__,__package__);

次に、このようにC#からfoo関数を呼び出します

var pyRuntime = Python.CreateRuntime();
ScriptEngine pyEng = pyRuntime.GetEngine("python");
ScriptSource source = pyEng.CreateScriptSourceFromFile("MyModule.py");
ScriptScope scope = pyEng.CreateScope();
source.Execute(scope);               
Func<int, bool> f = bis.GetVariable<Func<int, bool>>("foo");
f(1);

ただしSource.Execute(scope);、次の例外がスローされます - ValueError: Attempted relative import in non-package

import mypackageスクリプトから削除すると、すべてがスムーズに進みます。もちろん、Python コンソールでは、このスクリプトは正常に機能しており、すべてのインポートが正しく解決されています。もう 1 つ言及しておくと、私の Visual Studio プロジェクトは C:\users\Me\MyDocuments......\PythonDLRTest にあり、もちろんそこから実行されています。スクリプトに示されているように配置されたパッケージをインポートしています。私が直面している問題は、これらのパスに何らかの関連があると推測しています。

私が間違っていることと、このインポートの問題を解決する方法を誰かが説明できるかもしれません。また、python と ironpython の低レベルの違いと、インポートの解像度が異なる理由を理解することも非常に興味深いでしょう。

4

0 に答える 0