Аргументы скрипта и встроенный IronPython

В моем приложении C # есть встроенный механизм сценариев, использующий IronPython 2. Я создаю среду выполнения Python и добавляю несколько классов в глобальное пространство имен, чтобы сценарий мог импортировать их как модули.

Однако одна (довольно простая) вещь, которую я не могу понять, - это как отправлять аргументы скрипта. Я понимаю, что могу просто создать переменную со списком аргументов, но должен быть правильный способ сделать это. Кроме того, выполнение этого правильным «Python» способом позволяет мне компилировать сценарии и использовать автоматизированный конструктор документов под названием Sphinx. Итак, конечная цель - уметь использовать:

import sys
sys.argv

В одном из моих сценариев и получить аргументы, указанные пользователем (через приложение C #).

Прямо сейчас я вызываю сценарий, используя:

// set up iron python runtime engine
_engine = Python.CreateEngine();
_runtime = _engine.Runtime;
_scope = _engine.CreateScope();

// run script
_script = _engine.CreateScriptSourceFromFile(_path);
_script.Execute(_scope);

И я безуспешно пытался найти API для добавления аргументов скрипта. Я также попытался добавить их в путь к сценарию (например, _path), но безуспешно. Я пробовал использовать CreateScriptSourceFrom File и CreateScriptSourceFromSting (что в любом случае было долгим шансом ...).

Возможно ли то, что я пытаюсь сделать?


person cgyDeveloper    schedule 21.10.2009    source источник


Ответы (2)


При создании движка вы можете добавить параметр «Аргументы», содержащий ваши аргументы:

IDictionary<string, object> options = new Dictionary<string, object>();
options["Arguments"] = new [] { "foo", "bar" };
_engine = Python.CreateEngine(options);

Теперь sys.argv будет содержать ["foo", "bar"].

Вы можете установить options["Arguments"] на все, что реализует ICollection<string>.

person Jeff Hardy    schedule 21.10.2009
comment
Вы не указали версию, но для этого может потребоваться 2.6 - у меня нет 2.0, чтобы проверить. - person Jeff Hardy; 21.10.2009
comment
Требуется ли что-то дополнительное на стороне сценария python, чтобы это работало? - person Chris; 15.12.2014

sys.argv в конечном итоге вернет фактические параметры, переданные в приложение для хостинга. Вот несколько способов решить эту проблему:

  1. Перепишите свой скрипт, чтобы он принимал глобальные переменные, затем используйте ScriptScope.SetVariable
  2. Запустите скрипт, но полагайтесь на него, чтобы фактически вернуть вам класс, для которого вы можете вызывать методы (намного проще в 4.0 с динамическим ключевым словом)
  3. Замените sys.argv своей собственной реализацией (в конце концов, это динамический язык!)
person Ana Betts    schedule 21.10.2009
comment
Хммм ... Я думаю, №3 будет лучшим вариантом. Полагаю, мне придется выполнить import sys и sys.argv = args в моем ScriptScope как операторы из C #? Тогда 'import sys' и 'args = sys.argv' в моем скрипте будут работать, да? Я должен сделать это в сценарии (import sys, если sys существует), чтобы Sphinx распознал мои сценарии как действительный Python и создал документацию. - person cgyDeveloper; 21.10.2009