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控制进程之间的父/子关系