Сценарий аргументов и встроенный 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 (что в любом случае было слишком долго...).

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

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>,

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

  1. Перепишите ваш скрипт, чтобы он принимал глобальные переменные, затем используйте ScriptScope.SetVariable
  2. Запустите скрипт, но положитесь на него, чтобы фактически вернуть вам класс, для которого вы можете вызывать методы (намного проще в 4.0 с динамическим ключевым словом)
  3. Переопределите sys.argv своей собственной реализацией (в конце концов, это динамический язык!)
Другие вопросы по тегам