У меня есть библиотека Python, которую я пытаюсь использовать через вызов IronPython (v2.7 RC1 [2.7.0.30]) из приложения C #. Библиотека довольно широко использует NumPy и SciPy, которые действительно работают с SciPy и NumPy для .NET при запуске с использованием ipy из командной строки следующим образом:
ipy.exe -X:Frames file_from_lib_importing_numpy.py
Однако, когда я вызываю IronPython из C #, используя приведенный ниже код, возникает исключение:
ImportException
"No module named mtrand"
at Microsoft.Scripting.Runtime.LightExceptions.CheckAndThrow(Object value)
at IronPython.Runtime.Operations.PythonOps.ImportStar(CodeContext context, String fullName, Int32 level)
at Microsoft.Scripting.Interpreter.ActionCallInstruction3.Run(InterpretedFrame frame)
...
at Microsoft.Scripting.SourceUnit.Execute(Scope scope, ErrorSink errorSink)
at Microsoft.Scripting.Hosting.ScriptSource.Execute(ScriptScope scope)
at Microsoft.Scripting.Hosting.ScriptEngine.ExecuteFile(String path)
at Microsoft.Scripting.Hosting.ScriptRuntime.ExecuteFile(String path)
at Microsoft.Scripting.Hosting.ScriptRuntime.UseFile(String path)
...
Код C # (его часть), который вызывает IronPython, выглядит следующим образом:
ScriptEngine _engine;
var opts = new Dictionary<string, object>();
opts["Frames"] = ScriptingRuntimeHelpers.True;
_engine = Python.CreateEngine(opts);
var sp = _engine.GetSearchPaths();
sp.Add(@"c:\Program Files\IronPython 2.7");
sp.Add(@"c:\Program Files\IronPython 2.7\DLLs");
sp.Add(@"c:\Program Files\IronPython 2.7\Lib");
sp.Add(@"c:\Program Files\IronPython 2.7\Lib\site-packages");
sp.Add(_path);
_engine.SetSearchPaths(sp);
var _runtime = _engine.Runtime;
var scope = _runtime.ExecuteFile(Path.Combine(_path, "mytest.py"));
В целях тестирования я выполняю следующий файл mytest.py:
import sys
sys.path.append(r'c:\Program Files\IronPython 2.7')
sys.path.append(r'c:\Program Files\IronPython 2.7\DLLs')
sys.path.append(r'c:\Program Files\IronPython 2.7\Lib')
sys.path.append(r'c:\Program Files\IronPython 2.7\Lib\site-packages')
import os, os.path
cd = os.path.dirname(__file__)
if not cd in sys.path:
sys.path.append(os.path.dirname(__file__))
import numpy as np
print 'OK'
x = np.array([1,2])
print x
Что не удается в строке 12 'import numpy as np'. Проблема в том, что файл __init__.py
в IronPython 2.7 \ Lib \ site-packages \ numpy \ random \ содержит следующую строку
from mtrand import *
который терпит неудачу. Обратите внимание, что mtrand - это не модуль, это каталог. Я не могу придумать ничего другого, что бы я мог попытаться выполнить, поэтому я был бы очень признателен за любую вашу помощь. Большое Вам спасибо.
print sys.path
, И дает лиsys.path.append(r'c:\Program Files\IronPython 2.7')
послеimport sys
такие же результаты? - person Preet Sangha   schedule 03.04.2011sys.path
не содержит путей, установленных в приложении. Кроме того, когда я добавляю строкуsys.path.append(r'c:\Program Files\IronPython 2.7')
, происходит сбой без модуля с именем numpy. Мне действительно нужно настраивать пути в каждом файле Python, который я хочу использовать из приложения C #? - person PeterParameter   schedule 03.04.2011