Вызов скрипта Python с аргументами с использованием IronPython - «Нужно больше чем x значений для распаковки» - PullRequest
3 голосов
/ 02 июля 2011

Я использую следующий код C # для вызова скрипта Python с использованием IronPython:

ScriptEngine scriptEngine;

var opts = new Dictionary<string, object>();
opts["Arguments"] = new[] { 
    Server.MapPath(@"~\Processing\input.7z"), // Input
    Server.MapPath(@"~\Processing\key.pem"),  // Key
    Server.MapPath(@"~\Processing\") };       // Output
        scriptEngine = Python.CreateEngine(opts);

var sp = scriptEngine.GetSearchPaths();
sp.Add(Server.MapPath(@"~\python\lib"));
scriptEngine.SetSearchPaths(sp);

var scope = scriptEngine.Runtime.ExecuteFile(Server.MapPath(@"~\python\test.py"));

Скрипт принимает следующие аргументы:

arg0,input,key,output = sys.argv

Я получаю сообщение об ошибке "Нужно более 3 значений для распаковки". Что я делаю не так?

Ответы [ 2 ]

5 голосов
/ 02 июля 2011

Линия

arg0,input,key,output = sys.argv

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

Попробуйте другой способ передачи аргументов командной строки (из этот ответ ):

scriptEngine.Sys.argv = List.Make(new[] { 'input.7z', ... });

В качестве альтернативы, если это не сработает, либо удалите переменную arg0 из назначения в файле Python, либо явно добавьте путь сценария в качестве первого аргумента в C #.

2 голосов
/ 02 июля 2011

Что ж, буквальное значение этой ошибки в том, что sys.argv содержит только 3 значения, но у вас есть 4 переменные.(Сообщение об ошибке, которое вы получите, если попытаетесь распаковать 4 значения в 3 переменные, будет «слишком много значений для распаковки».)

Почему в sys.argv нет arg0, я не понимаюне знаю - я могу только предположить, что это как-то связано с тем, как .NET обрабатывает аргументы в подобных случаях.Снимите arg0 и посмотрите, что получится.

...