我的程序位于 .net 框架中,它读取 python 脚本并尝试使用 IronPython 包执行它。在 python 脚本中,我们导入 python 模块(可以是任何 python 模块)。执行时,我收到错误“未找到模块 [模块名称]”。我尝试将模块从 python 安装目录复制到解决方案目录,然后似乎找到了该模块,但给了我一个例外。以下是脚本和错误
import random
random_number = random.randint(1, 100)
print(str(random_number))
序列项0:期望的字节或字节数组,找到str
我找到了针对错误的建议,将结果转换为字节,如所附屏幕截图所示。
但是当我在程序中运行脚本时这也不起作用
请帮我解决这个问题。
我尝试更新脚本响应以发送字节而不是 str,因为我收到此异常 序列项 0:预期字节或字节数组,找到 str
我完全明白你来自哪里。处理 IronPython 可能会令人沮丧,尤其是当您遇到模块问题和像您提到的那样的奇怪错误时。 IronPython 不能与所有 Python 模块兼容,因为它不使用标准 Python 解释器 (CPython)。相反,它是 Python 的 .NET 版本,这就是事情开始崩溃的地方,特别是当您尝试使用第三方模块或处理字节/字符串转换等内容时。
与其处理 IronPython 的复杂性,我建议检查 Javonet,而不是使用正在运行的脚本,为什么不直接要求 .NET 在代码中调用 Python 包呢? :) 是的,这可以通过 Javonet 实现。使用 Javonet,您可以直接在 .NET 中调用包和 python 命令,或者直接从 .NET 代码运行 python 脚本。我知道这感觉很奇怪,但你应该检查一下!这里有一篇简单的文章,展示了用其他语言调用Python的逻辑。您可以在这里找到 .NET 和 Python 教程!
这里是直接从 .NET 使用 Python Math PI
的实现namespace SampleProgram;
// <Import>
using Javonet.Netcore.Sdk; //or using Javonet.Clr.Sdk for .NET Framework apps
// </Import>
class SampleProgram
{
static void Main(string[] args)
{
// <Activation>
Javonet.Activate("your-license-key");
// </Activation>
// <RuntimeContextCreation>
var pythonRuntime = Javonet.InMemory().Python();
// </RuntimeContextCreation>
// <GetType>
var pythonType = pythonRuntime.GetType("math").Execute();
// </GetType>
// <GetStaticField>
var response = pythonType.GetStaticField("pi").Execute();
// </GetStaticField>
// <GetValue>
var result = (double)response.GetValue();
System.Console.WriteLine(result);
// </GetValue>
}
}
例如,从java调用python包(我有代码片段,但你可以将几乎任何语言调用到任何其他语言) - 在这里直接调用Java中的PyJokes!
import com.javonet.sdk.Javonet;
import com.javonet.sdk.InvocationContext;
import com.javonet.sdk.RuntimeContext;
public class App {
public static void main(String[] args) {
Javonet.activate("<your-javonet-key>");
RuntimeContext pythonRuntime = Javonet.inMemory().python();
InvocationContext jokeInstance = pythonRuntime.getType("pyjokes.get_joke").createInstance().execute();
String result = (String) jokeInstance.getValue();
System.out.println("Your PyJoke with Javonet: ");
System.out.println(result);
}
}
对于 .NET 和 Python 来说,它非常相似 Javonet .NET 指南。我认为这会解决您的问题:) 在这里查看以了解这项技术其他语言的 Javonet PyJokes