在.NET Framework中如何将IronPython包与Python模块一起使用,例如:TensorFlow,Pandas,NumPy

问题描述 投票:0回答:1

我的程序位于 .net 框架中,它读取 python 脚本并尝试使用 IronPython 包执行它。在 python 脚本中,我们导入 python 模块(可以是任何 python 模块)。执行时,我收到错误“未找到模块 [模块名称]”。我尝试将模块从 python 安装目录复制到解决方案目录,然后似乎找到了该模块,但给了我一个例外。以下是脚本和错误

import random
random_number = random.randint(1, 100)
print(str(random_number))

序列项0:期望的字节或字节数组,找到str

我找到了针对错误的建议,将结果转换为字节,如所附屏幕截图所示。

但是当我在程序中运行脚本时这也不起作用

请帮我解决这个问题。

脚本工作示例

我尝试更新脚本响应以发送字节而不是 str,因为我收到此异常 序列项 0:预期字节或字节数组,找到 str

python c# .net scripting ironpython
1个回答
0
投票

我完全明白你来自哪里。处理 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);
    }
}

对于 .NETPython 来说,它非常相似 Javonet .NET 指南。我认为这会解决您的问题:) 在这里查看以了解这项技术其他语言的 Javonet PyJokes

© www.soinside.com 2019 - 2024. All rights reserved.