如何扩展搜索环境变量%ProgramData%并使用启动信息

时间:2016-12-06 03:31:21

标签: c# directory environment-variables python-3.5 programdata

我将PythonApplication1.py放入C#Windows窗体应用程序的源代码中。在特定条件下,我将其写入Program Data文件夹:

File.WriteAllBytes(@"%ProgramData%\\Folder\\PythonApplication1.py", Resources.PythonApplication1);

然后以特定条件C#从程序数据文件夹运行Python Application,这样:

Process.Start(@"%ProgramData%\\Folder\\PythonApplication1.py");

在Python代码方面,我得到了第二件事,它将一些数据写入文本文档,该文档位于同一路径,但是它本身的创建发生在Python本身,但它可以通过C#代码完成,没有问题,这里:

path = (@"%ProgramData%\Folder\doc.txt")

但是python代码必须通过相同的程序数据路径写入此文件:

data = open (r'doc.txt', 'w')

并且只是在相同的位置写,因为两者都在那里:

with open(r'doc.txt') as my_file:   

问题是,当我像上面所示运行这个python代码时,这样:

 Process.Start(@"%ProgramData%\\Folder\\PythonApplication1.py");

如果它不是%ProgramData%目录并且位于调试文件夹中的C#.exe,只是Process.Start("PythonApplication1.py");,或者我在%ProgramData%\Folder内运行Python代码,它会发生两件错误的事情。带有doc.txt的{1}}路径,只需手动操作即可。它直接创建并写入文件,一切正确。

否则,如果Process.Start(@"%ProgramData%\\Folder\\PythonApplication1.py");我得到第二个结果,它不会将数据写入doc.txt %ProgramData%\Folder,而python代码会在带有C#.exe的调试文件夹中的程序数据文件夹中创建它。 / p>

所以问题是如何从python代码创建和写入由C#Application"%ProgramData%\ Folder"所定位的doc.txt。路径。

似乎,如果ProgramData中存在PythonApplication1.py:

File.WriteAllBytes(@"%ProgramData%\\TAOZ\\PythonApplication1.py", Resources.PythonApplication1);

如果手工执行它会创建文本文档并写入它,它必须使用Process.Start,但不能。

我也尝试使用星级信息,但不确定这是否正确,无论如何我得到了相同的结果:

    ProcessStartInfo startInfo = new ProcessStartInfo(@"%ProgramData%\\folder\\PythonApplication1.py");
    startInfo.WindowStyle = ProcessWindowStyle.Minimized;
    Process.Start(startInfo);

所以我觉得这里需要两件事。要扩展搜索环境变量%ProgramData%。并且还需要使用启动信息告诉进程在该特定文件夹上启动。否则,当前工作文件夹将与我猜的应用程序相同,但不知道如何操作,如果是问题的原因,需要你的帮助。

1 个答案:

答案 0 :(得分:0)

因为它是一个python程序,所以你必须指向python EXE。假设你有pythonpath环境变量,这应该工作:

ProcessStartInfo startInfo = new ProcessStartInfo(Environment.ExpandEnvironmentVariables(@"%PYTHONPATH%\python.exe"), Environment.ExpandEnvironmentVariables(@"%ProgramData%\folder\PythonApplication1.py"));
startInfo.WorkingDirectory = Environment.ExpandEnvironmentVariables(@"%ProgramData%\folder\");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;
Process.Start(startInfo);