使用IronPython调用带参数的Python脚本 - "需要更多的x值来解压

3 投票
2 回答
1620 浏览
提问于 2025-04-16 20:43

我正在使用下面的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# 中把脚本的路径明确地作为第一个参数添加上。

撰写回答