Эквивалент IronPython 'execfile' в C # - PullRequest
1 голос
/ 27 марта 2012

Я хотел бы знать, как выполнить функциональность команды Python 'execfile' но с C#. В этом примере:

var runtime = Python.CreateRuntime();
dynamic scope = Python.UseFile("body.py");

вы указываете файл тела.

В заголовке body.py я указываю заголовок:

execfile('header.py')

Я хотел бы сделать этот execfile из C#, как я могу это сделать?

Примечание: импорт не работает, потому что внутри я динамически объявляю переменные Область заголовка. импорт не будет импортировать эти переменные, потому что они делают еще не существует.

Большое спасибо!

1 Ответ

1 голос
/ 28 марта 2012

Если вы хотите отличить поведение от файла exec, вы можете легко создать свой собственный и делать такие вещи (делить область), создав функцию в .NET и установив ее в область.Это также позволит вам добавить дополнительную функциональность, если хотите.

Кажется, это работает:

Настройка двигателя:

var py = Python.CreateEngine();
var source = py.CreateScriptSourceFromFile(@"..\..\IronPython\body.py");
var scope = py.CreateScope();

Затем я создаю функцию, котораяможет использоваться сценариями и устанавливать его в области действия

Action<string> execFileCallback = fileName =>
{
    var s2 = py.CreateScriptSourceFromFile(fileName);
    s2.Execute(scope);
};
((dynamic)scope).myexecfile = execFileCallback;
source.Execute(scope);

Теперь мой Body.py выглядит следующим образом:

someVarSetByBody = "This was set by the body"
Console.WriteLine("Body is loading")
myexecfile(r"..\..\IronPython\Header.py")
Console.WriteLine("Body has loaded")

А мой Header.py выглядит следующим образом:

Console.WriteLine("Header is loading")
Console.WriteLine("Variable set by body: %s" %  someVarSetByBody)
Console.WriteLine("Header has loaded")

Теперь можно использовать одну и ту же область видимости в разных сценариях, чтобы вы могли делиться переменными.

...