C#无法调用python并传递参数

C#无法调用python并传递参数,python,c#,Python,C#,我是一个编程新手,我有一个MVC项目。我想使用C#调用Pythonpy文件并传递参数来制作图表。我参考了这篇文章。我使用此方法制作了很多图表,它们可以成功地执行和传递参数。只有两个文件无法成功调用和传递参数,我认为这是因为Python有一个错误,无法调用py 下面是一个失败的例子。当我在Spyder中单独运行proporty.py时,它可以成功地使用固定参数。但是当我使用C#调用它时,将不会有响应。文件中的语法已确认可以顺利执行,方法我已经尝试了很多方法,但仍然没有解决。请保存我的项目,我将非常

我是一个编程新手,我有一个MVC项目。我想使用
C#
调用Python
py
文件并传递参数来制作图表。

我参考了这篇文章。

我使用此方法制作了很多图表,它们可以成功地执行和传递参数。只有两个文件无法成功调用和传递参数,我认为这是因为
Python
有一个错误,无法调用
py

下面是一个失败的例子。当我在Spyder中单独运行
proporty.py
时,它可以成功地使用固定参数。但是当我使用
C#
调用它时,将不会有响应。

文件中的语法已确认可以顺利执行,方法我已经尝试了很多方法,但仍然没有解决。请保存我的项目,我将非常感激<谢谢你的帮助

下面是我如何使用
C
调用
Python

public ActionResult Index(string searchString, DateTime? startdate, DateTime? enddate)
{
    run_sound("D:/Python/pie.py", "" + sd + "", "" + ed + "", "" + searchString + "");
    run_Emoanalysis("picture/AAApy.py", "" + sd + "", "" + ed + "", "" + searchString + "");
    run_proportion("D:/Microsoft Visual Studio/MVC project/MVC project/picture /proportion.py", "" + sd + "", "" + ed + "", "" + searchString + "");
}
    
    
    
//The following is the function of run_proportion,
//other functions(run_sound) are the same as this method, and carefully confirmed.
    
private string run_proportion(string cmd, string sdate, string edate, string condition)
{
    ProcessStartInfo start = new ProcessStartInfo();
    start.FileName = @"C:/Users/user/AppData/Local/Programs/Python/Python38-32/python.exe";
    start.CreateNoWindow = true;
    start.Arguments = string.Format("{0} {1} {2} {3}", cmd, sdate, edate, condition);
    start.UseShellExecute = false;
    start.RedirectStandardOutput = true;

    using (Process process = Process.Start(start))
    {
        using (StreamReader reader = process.StandardOutput)
        {
            string result = reader.ReadToEnd();
            //Console.Write(result);
            process.WaitForExit();
            return result;
        }
    }
}
下面是
proporty.py
,不能由
C#
调用和执行


运行python也有一些问题,第一个建议用变量替换字符串中的引号,因为这样可以更容易地跟踪它们

        var quote = '"';
在完成整个字符串之后,还要做一个

var commandUnescaped = Regex.Unescape(command);
粘贴“我的方式”以在需要时调用命令,需要使其适应windows,但逻辑相同:

   private (bool,string,string) RunCommand(string command, string args)
    {
        args = args.Replace("\"", "\\\"");
        var process = new Process()
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = "/bin/bash",
                Arguments = $"-c \"{args}\"",
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                UseShellExecute = false,
                CreateNoWindow = true,
            }
        };
        process.Start();
        string output = process.StandardOutput.ReadToEnd();
        string error = process.StandardError.ReadToEnd();
        process.WaitForExit();

        if (string.IsNullOrEmpty(error))
        {
            return (true,output,error);
        }
        else
        {
            return (false,output,error);
        }
    }

不确定这是否是您的问题,但是
“+s+”
不会在
s
周围添加引号(这是我假设您认为它会做的)-
是一个空字符串,因此它会在
s
中添加两个空字符串,这只会留下<代码>s。您可能想要
“\\”
+s+“\”`(
是一个包含双引号字符的字符串),或者
“+s+”
@“{s}”“
MRE中的M代表最小值。请把你的代码压缩成一个字母。将你的全部代码粘贴到这里是一个让人们点击远离你的问题的好方法。@canton7谢谢你的回复!我键入
“+s+”
是因为我的另一个函数(run\u bar,run\u wc…)可以成功地传递参数并执行,所以我在调用run\u proporty时执行相同的函数,但不能执行
proporty.py
excute@PranavHosangadi哦,好的,我现在改进它!
   private (bool,string,string) RunCommand(string command, string args)
    {
        args = args.Replace("\"", "\\\"");
        var process = new Process()
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = "/bin/bash",
                Arguments = $"-c \"{args}\"",
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                UseShellExecute = false,
                CreateNoWindow = true,
            }
        };
        process.Start();
        string output = process.StandardOutput.ReadToEnd();
        string error = process.StandardError.ReadToEnd();
        process.WaitForExit();

        if (string.IsNullOrEmpty(error))
        {
            return (true,output,error);
        }
        else
        {
            return (false,output,error);
        }
    }