Как развернуть переменную среды поиска%ProgramData% и использовать начальную информацию
Я получил PythonApplication1.py
в источники приложения C# Windows Form. При определенных условиях я записываю его в папку 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");
или если я запускаю Python Code внутри %ProgramData%\Folder
путь с doc.txt, просто вручную. Он создает и пишет прямо в файл, все правильно.
В противном случае, если Process.Start(@"%ProgramData%\\Folder\\PythonApplication1.py");
Я получил второй результат, он не записывает данные в doc.txt %ProgramData%\Folder
и код Python создает его из папки данных программы в папке отладки с помощью C# .exe.
Так что вопрос в том, как создать и записать из кода Python в файл doc.txt, расположенный по пути приложения C% "ProgramData%\Folder".
Похоже, если PythonApplication1.py существует внутри ProgramData:
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 ответ
Поскольку это программа на 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);