使用IronPython调用带参数的Python脚本 - "需要更多的x值来解压
我正在使用下面的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 个回答
2
这个错误的字面意思是,sys.argv
里只有 3 个值,但你却定义了 4 个变量。(如果你试图把 4 个值放到 3 个变量里,系统会给你提示“要解包的值太多了”。)
至于为什么 sys.argv
里没有 arg0
,我也不太清楚——我只能猜这可能和 .NET 处理参数的方式有关。你可以试着去掉 arg0
,看看会发生什么。
5
这一行
arg0,input,key,output = sys.argv
是把 sys.argv
里的参数列表拆分成左边的四个变量。可是因为 sys.argv
里只有三个参数,所以会出现你提到的错误信息(显然,你需要手动传入脚本路径,这样它才能作为 sys.argv
的第一个元素出现)。
你可以尝试另一种传递命令行参数的方法(参考 这个回答):
scriptEngine.Sys.argv = List.Make(new[] { 'input.7z', ... });
另外,如果这样还是不行,那就要么在 Python 文件的赋值中去掉 arg0
这个变量,要么在 C# 中把脚本的路径明确地作为第一个参数添加上。