для scriptcs `динамический` не поддерживается Roslyn и доступен только с моно, но моно не работает с DLL

Я пытаюсь загрузить dll времени выполнения pythonnet из scriptcs, и он не работает с бэкэндом roslyn, потому что динамический не поддерживается в Roslyn, но монофонический бэкэнд задыхается со следующей ошибкой:

$ scriptcs -modules mono
scriptcs (ctrl-c to exit or :help for help)

> #r "F:\Python\Python27\Lib\site-packages\Python.Runtime.dll"
error CS0009: Metadata file `F:\Python\Python27\Lib\site-packages\Python.Runtime.dll' does not contain valid metadata

Вопрос:


Как я могу заставить Mono бэкенд scriptcs работать с Python.Runtime.DLL? Нужно ли перед этим загружать какие-либо библиотеки DLL? Должен ли Python.Runtime.DLL быть скомпилирован с поддержкой Mono или .NET в порядке?


person denfromufa    schedule 09.09.2015    source источник
comment
github.com/scriptcs/scriptcs/issues/1092   -  person denfromufa    schedule 03.10.2015


Ответы (1)


Эта ошибка (CS0009 с монокомпилятором) является довольно общей и означает, что "что-то не так" с данной сборкой, поэтому ее довольно сложно отлаживать. Один из способов продолжить - действительно скомпилировать под моно. Если вы загрузите их исходный код (https://github.com/pythonnet), вы найдете инструкции о том, как это сделать. это (посмотрите также на pythonnet\src\monoclr\README.txt).

Однако, в зависимости от ваших целей, вы можете вместо этого рассмотреть возможность использования IronPython, который официально поддерживается mono и работает сразу из коробки. Пример ниже предполагает, что вы скачали zip-файл IronPython и распаковали его куда-то:

scriptcs -modules mono
scriptcs (ctrl-c to exit or :help for help)
> #r "G:\dev_tools\IronPython-2.7.5\IronPython-2.7.5\IronPython.dll"
> #r "G:\dev_tools\IronPython-2.7.5\IronPython-2.7.5\Microsoft.Dynamic.dll"
> #r "G:\dev_tools\IronPython-2.7.5\IronPython-2.7.5\Microsoft.Scripting.dll"
> using System;
> using System.IO;
> using IronPython.Hosting;
> using Microsoft.Scripting;
> using Microsoft.Scripting;
> using Microsoft.Scripting.Hosting;
> string script = "print 'hello world'";
> var engine = Python.CreateEngine();
> var scope = engine.CreateScope();
> var source = engine.CreateScriptSourceFromString(script, SourceCodeKind.Statements);
> var compiled = source.Compile();
> var result = compiled.Execute(scope);
hello world
>
person Evk    schedule 12.09.2015
comment
Суть в интерактивном тестировании числового кода CPython, встроенного в C#. Ironpython не вариант. - person denfromufa; 19.09.2015
comment
Мне нужно протестировать под .NET, потому что это производственная среда, а не Mono. - person denfromufa; 19.09.2015
comment
.NET - это производственная среда, но в сценариях, которые вы загружаете под моно в своем примере. Значит вы работаете под моно, а Pythonnet там без перекомпиляции под моно работать не будет. - person Evk; 19.09.2015
comment
Также просмотрите code.google.com/p/ironclad. Если вы приведете конкретный пример того, что вы пытаетесь сделать, и почему вам нужны скрипты для этого - возможно, я смогу помочь вам больше - person Evk; 19.09.2015
comment
Mono используется для самоанализа в скриптах. Ironclad и другие связанные проекты для Ironpython заморожены примерно с 2012 года. Вы когда-нибудь пробовали использовать scipy с Ironpython?! - person denfromufa; 19.09.2015
comment
Я вижу, что IronPython вам не подходит. Ну, вы спросили, как загрузить dll времени выполнения pythonnet в среде mono в scriptcs, я ответил - попробуйте скомпилировать его с помощью компилятора mono из исходников. - person Evk; 19.09.2015