2010-09-13 2 views
3

Я следую примеру из лучшего ответа здесь, на T, с компиляцией с Pyc.py.IronPython, импортирующие модули

Build Python scripts and call methods from C#

я получаю исключение в pyScope = pyEngine.ImportModule("MyClass");

no module named MyClass 

Я считаю, что это ошибка, так как иногда перекомпиляция с Pyc.py будет производить длл ImportModule признает, но в других случаях это не ,

ЗАКЛЮЧЕНИЕ: Как указано ниже, digEmAll, компиляция модулей с Pyc.py для использования таким способом дает случайные результаты. Вместо этого вызовите clr.CompileModules.

ответ

7

OK, У меня есть.

Имя модуля - это имя (с учетом регистра) исходного модуля .py, а не скомпилированная dll.

Я имею в виду, если исходное имя модуля был myClass.py, то он был скомпилирован в MyClass.dll, вы должны ImportModule("myClass") не ImportModule("MyClass")


EDIT:

предыдущий код относится к следующей компиляции метод:

import clr 
clr.CompileModules("CompiledScript.dll", "script.py") 

О наоборот, используя pyc.py, сгенерированная dll содержит модуль с именем __main__ вместо имени файла .py.

Это очень странно ...

IIRC, в питоне модуль называют себя __main__, если он работает автономно (т.е. не вызывается другим), но я до сих пор не понимает связь ...

+1

Ах, модуль, который должен быть импортирован, все еще берет имя скрипта, из которого была создана сборка, а не сама сборка. Я могу подтвердить, что это правда. –

+0

Спасибо, но это не решило проблему, поскольку фраза «MyClass» не появляется нигде в моем проекте, как что-либо, кроме «MyClass». Я думаю, что комментарий Джеффа М по поводу версий - это мой следующий путь расследования. Какую версию IronPython и .NET вы используете? Хотелось бы услышать от разработчиков об этом. – cory

+0

Попробуйте переименовать .py по-другому, но не MyClass.py. Во всяком случае, я успешно выполнил его как для .NET 2.0/4.0, так и IronPython.dll 2.6.10920.0 – digEmAll

Смежные вопросы