Вопрос

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

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

Это было полезно?

Решение

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

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 своей собственной реализацией (в конце концов, это динамический язык!)
  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top