Сценарий аргументов и встроенный IronPython - PullRequest
4 голосов
/ 21 октября 2009

У меня есть встроенный механизм сценариев в моем приложении 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 ]

6 голосов
/ 21 октября 2009

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

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

1 голос
/ 21 октября 2009

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

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