Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 启动。进程未在单独的进程中运行scipt_C#_Python_.net Core - Fatal编程技术网

C# 启动。进程未在单独的进程中运行scipt

C# 启动。进程未在单独的进程中运行scipt,c#,python,.net-core,C#,Python,.net Core,我想从我的控制台应用程序运行我的长时间运行的python脚本。 我用 (“my_script.py”),当我关闭控制台时,python脚本也会终止。 在任务管理器中,所有(控制台应用程序和脚本)都在.Net核心主机下运行。 如何将python作为完全分离的进程运行?通常,这将在控制台应用程序之外完全启动python脚本: System.Diagnostics.Process.Start(@"C:\path\to\my_script.py"); 在经典的.NET中,它将通过一个新的shell调用


我想从我的控制台应用程序运行我的长时间运行的python脚本。
我用 (“my_script.py”),当我关闭控制台时,python脚本也会终止。
在任务管理器中,所有(控制台应用程序和脚本)都在.Net核心主机下运行。

如何将python作为完全分离的进程运行?

通常,这将在控制台应用程序之外完全启动python脚本:

System.Diagnostics.Process.Start(@"C:\path\to\my_script.py");
在经典的.NET中,它将通过一个新的shell调用该进程,但在.NET内核中,该进程直接在现有的可执行文件中创建。有一个选项可以更改此设置,名为
UseShellExecute

true
启动过程时是否应使用外壳
false
如果进程应该直接从可执行文件创建。在.NET Framework应用程序上默认为
true
,在.NET核心应用程序上默认为
false

您可以这样使用它:

var myPythonScript = new Process();
myPythonScript.StartInfo.FileName = @"C:\path\to\my_script.py";
myPythonScript.StartInfo.UseShellExecute = true;
myPythonScript.Start();
当您的C#控制台应用程序终止时,您的python脚本应该仍在运行

编辑 多亏了Panagiotis Kanavos,他让我意识到
UseShellExecute
与进程之间的父/子关系无关。因此,我在本地使用.NET Core设置了一个沙盒,并对其进行了一些操作,这对我来说很有用:

var myPythonScript = new Process();
myPythonScript.StartInfo.FileName = @"C:\path\to\python.exe"; // the actual python installation executable on the server
myPythonScript.StartInfo.Arguments = @"""C:\path\to\my_script.py""";
myPythonScript.StartInfo.CreateNoWindow = true;
myPythonScript.Start();

当父应用程序终止时,我的python脚本仍在后台运行。

它可能满足您的需要。您是如何启动该过程的?发布你的代码。抱怨一旦父母被杀,子进程仍然有效。我觉得我错过了什么。问题是“Process.Start”(假设输入错误)不起作用。答案是肯定的。我错过了什么?API或调用序列中是否存在一些重要的微妙交互?@omajid啊,我现在明白了。我更新了我的答案。这是因为.NET内核的行为与经典的.NET不同framework@jtate它是直接来自可执行文件的
,这意味着来自传递给epath参数的文件。没有试图找到哪个应用程序可以处理文件扩展名。绝对不是直接在现有可执行文件中
。您不能在进程内创建进程。
UseShellExecute
是一个蠕虫程序
UseShellExecute
+脚本在较新版本上不起作用。看见在最近的版本中,它确实是
xdg open
而不是
bash-c
:(我建议手动调用
bash
,但我怀疑我们会遇到OP的问题(递归!)在任何情况下,都不是Shell控制进程之间的父/子关系