如何启动外部程序更改目录
How to launch an external program changing directory
我必须从另一个文件夹启动 Python。
为此,我必须更改文件夹。就像我做了 Cd ..pythonPath...
我做的任务是:
从环境变量中获取Python路径
string strPath = Environment.GetEnvironmentVariable("Path");
string[] splitPath = strPath.Split(';');
string strPythonPath = String.Empty;
foreach (string path in splitPath)
{
if (path.ToUpper().Contains("PYTHON"))
{
strPythonPath = path;
break;
}
}
这样我就得到了脚本文件夹,所以我向上移动了一个
strPythonPath = Path.GetFullPath( Path.Combine(strPythonPath, ".."));
我启动外部进程
Process ExternalProcess = new Process();
ExternalProcess.StartInfo.FileName = "Phyton.exe";
string strPythonScript = @"C:\temp\script.py";
string strTestPool = "testPool.xml";
ExternalProcess.StartInfo.WorkingDirectory = strPythonPath;
ExternalProcess.StartInfo.Arguments = strPythonScript + " " + strTestPool + " " + strTemp;
ExternalProcess.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
ExternalProcess.Start();
ExternalProcess.WaitForExit();
这样我就找不到指定的文件了。
当然我也可以把完整的路径放在
ExternalProcess.StartInfo.FileName = " C:\Program Files\Python39\Phyton.exe";
但这是正确的做法吗?
再一次我想要的是像做事一样预先移动
cd C:\Program Files\Python39
另外它是否可以成为 Directory.SetCurrentDirectory(...) 解决方案?
谢谢
每个进程都有自己的工作目录,默认继承自父进程。在您的问题中,您提到了两个工作目录。
ExternalProcess.StartInfo.WorkingDirectory = strPythonPath;
Directory.SetCurrentDirectory(...)
第一个属于外部进程,第二个属于当前进程。当您启动外部进程 (pyhton.exe) 时,如果文件名不是绝对路径,则当前进程将尝试从其工作目录(第二个)搜索可执行文件。 (其实规则很复杂,这里简化了)。外部进程启动后,其工作目录(1st)接管该位置。
总之,你可以使用SetCurrentDirectory
或绝对FileName
,只是注意SetCurrentDirectory
会影响后面的过程。
我必须从另一个文件夹启动 Python。 为此,我必须更改文件夹。就像我做了 Cd ..pythonPath... 我做的任务是:
从环境变量中获取Python路径
string strPath = Environment.GetEnvironmentVariable("Path"); string[] splitPath = strPath.Split(';'); string strPythonPath = String.Empty; foreach (string path in splitPath) { if (path.ToUpper().Contains("PYTHON")) { strPythonPath = path; break; } }
这样我就得到了脚本文件夹,所以我向上移动了一个
strPythonPath = Path.GetFullPath( Path.Combine(strPythonPath, ".."));
我启动外部进程
Process ExternalProcess = new Process(); ExternalProcess.StartInfo.FileName = "Phyton.exe"; string strPythonScript = @"C:\temp\script.py"; string strTestPool = "testPool.xml"; ExternalProcess.StartInfo.WorkingDirectory = strPythonPath; ExternalProcess.StartInfo.Arguments = strPythonScript + " " + strTestPool + " " + strTemp; ExternalProcess.StartInfo.WindowStyle = ProcessWindowStyle.Maximized; ExternalProcess.Start(); ExternalProcess.WaitForExit();
这样我就找不到指定的文件了。 当然我也可以把完整的路径放在
ExternalProcess.StartInfo.FileName = " C:\Program Files\Python39\Phyton.exe";
但这是正确的做法吗?
再一次我想要的是像做事一样预先移动
cd C:\Program Files\Python39
另外它是否可以成为 Directory.SetCurrentDirectory(...) 解决方案?
谢谢
每个进程都有自己的工作目录,默认继承自父进程。在您的问题中,您提到了两个工作目录。
ExternalProcess.StartInfo.WorkingDirectory = strPythonPath;
Directory.SetCurrentDirectory(...)
第一个属于外部进程,第二个属于当前进程。当您启动外部进程 (pyhton.exe) 时,如果文件名不是绝对路径,则当前进程将尝试从其工作目录(第二个)搜索可执行文件。 (其实规则很复杂,这里简化了)。外部进程启动后,其工作目录(1st)接管该位置。
总之,你可以使用SetCurrentDirectory
或绝对FileName
,只是注意SetCurrentDirectory
会影响后面的过程。