0

PythonApplication1.py进入了 C# Windows 窗体应用程序的源代码。在特定条件下,我以这种方式将其写入 Program Data 文件夹:

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

然后在特定条件下 C# 从程序数据文件夹运行 Python 应用程序,这样:

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");,或者如果我使用 doc.txt 在路径内运行 Python 代码%ProgramData%\Folder,只是手动。它直接创建并写入文件,一切都是正确的。

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

所以问题是如何从 python 代码创建和写入位于 C# 应用程序“%ProgramData%\Folder”路径的 doc.txt 中。

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

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

如果手动执行它会创建文本文档并写入它,它必须执行 with Process.Start,但不是。

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

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

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

4

1 回答 1

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);
于 2016-12-06T03:57:33.617 回答