Как развернуть переменную среды поиска%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);
Другие вопросы по тегам