【问题标题】:How to pass a 2D array and vector from C# to python?如何将二维数组和向量从 C# 传递给 python?
【发布时间】:2020-09-05 07:03:39
【问题描述】:

我想将 2D 数组和 1D 向量传递给 python 脚本,并在 C# 中以 1D 向量接收输出。到目前为止,我一直关注这个视频:

https://www.youtube.com/watch?time_continue=1&v=g1VWGdHRkHs&feature=emb_logo

这里只展示了如何将字符串传递给python。

更新:

我正在合并@Danon 的方法。到目前为止,我有这个代码:

static void Main(string[] args)
        {
            double[] a = { 1, 2, 3, 4, 5 };
            List<double> lst = a.ToList();

            string jsona = new JavaScriptSerializer().Serialize(lst);


            var psi = new ProcessStartInfo();
                psi.FileName = @"C:\Users\lavni\Python\Python38\python.exe";

                var script = @"D:\test.py";

                psi.Arguments = string.Format("{0} {1}", script, jsona);
                psi.UseShellExecute = false;
                psi.CreateNoWindow = true;
                psi.RedirectStandardOutput = true;
                psi.RedirectStandardError = true;

                var errors = "";
                var results = "";

                using (var process = Process.Start(psi))
                {
                    errors = process.StandardError.ReadToEnd();
                    results = process.StandardOutput.ReadToEnd();

                    Console.WriteLine("Errors");
                    Console.WriteLine(errors);
                    Console.WriteLine();
                    Console.WriteLine("Results");
                    Console.WriteLine(results);

                }

            Console.Read();

        }

我有以下 python test.py。这只是将向量乘以 5 并以字符串形式接收输出:

import sys
import json
import numpy as np

data = json.loads(sys.argv[1])
res = np.array(data)
res = res*5

print(res)

现在,我可以在 C# 中传递一个向量并以字符串形式接收输出。现在,问题是我能否将输出作为 C# 中的列表而不是字符串接收。另外,在二维数组的情况下该怎么办。由于出现错误,它不能作为列表传递。

【问题讨论】:

    标签: python c# parameter-passing


    【解决方案1】:

    进程只能通过执行参数(通常称为argsargv)或通过标准输入(stdio)交换数据;而运行的进程只能以标准输出(stdout)、标准错误(stderr)或退出码(0-255之间)的形式返回数据。

    因此,您必须将二维数组和一维向量序列化为 c# 和 python 都可以读取的某种格式。它可以是任何二进制数据,但我建议你将 JSON 作为标准输入传递给 python 脚本,python 脚本可以在标准输出上输出 JSON,你可以在 c# 中读取和解析。

    运行不同类型数据的python脚本示例:

    python myfile.py data # passing data as execution parameters
    

    echo "data" | python myfile.py  # passing data on standard input
    

    PS:要在 python 中写入标准输出,您可以使用print()

    编辑:在 YouTube 视频中,这些人通过执行参数传递值 (3:52)。如果您想遵循该约定,而不是通过

    psi.Arguments = $"\"{script}\" \"{start}\"";
    

    将您的列表转换为 Json:

    string jsonString= new JavaScriptSerializer().Serialize(yourList);
    

    并将该 json 作为参数传递

    psi.Arguments = $"\"{script}\" \"{jsonString}\"";
    

    然后你必须在你的 python 脚本中解码 JSON。

    【讨论】:

    • 你能举个基本的例子让我理解吗?
    猜你喜欢
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 2021-05-10
    相关资源
    最近更新 更多