Сценарий аргументов и встроенный 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 будет возвращать фактические параметры, переданные в приложение хостинга. Вот несколько способов решить эту проблему:
- Перепишите ваш скрипт, чтобы он принимал глобальные переменные, затем используйте ScriptScope.SetVariable
- Запустите скрипт, но положитесь на него, чтобы фактически вернуть вам класс, для которого вы можете вызывать методы (намного проще в 4.0 с динамическим ключевым словом)
- Переопределите sys.argv своей собственной реализацией (в конце концов, это динамический язык!)