Форум сайта python.su
ActivePython под Windows. Как правильно вызывать сторонние приложения из консольных py-скриптов? Нужны три варианта:
1. Синхронный запуск консольного приложения с параметрами (т.е. чтобы управление не передавалось в py-скрипт до того, как это приложение завершит свою работу). Так, чтобы пользователь не видел никаких окон и вообще никаких признаков выполнения посторонней программы. При этом крайне желательно задать произвольный текущий каталог вызываемому приложению, так, чтобы оно “думало”, что его запустили именно из этого каталога.
2. То же самое, но ещё прочитать весь вывод запущенного приложения, чтобы иметь возможность работать с этим выводом в коде py-скрипта.
3. Асинхронный запуск графического приложения (т.е. чтобы управление передавалось в py-скрипт сразу после запуска).
Буду очень признателен за небольшие примеры кода. Спасибо!
Офлайн
1 – os.exec* функция или os.spawn* с флагом P_WAIT, или subprocess.Popen или os.popen и подождать завершения стороннего процесса
2 – os.popen или subprocess.Popen
3 – os.spawn* с флагом P_NOWAIT
Офлайн
subprocess рулит по любому =)
Офлайн
Спасибо, начал с самого простого - п.3:
import os params = ['C:\\Temp\\test.txt'] os.spawnv(os.P_NOWAIT, os.environ['SystemRoot'] + '\\system32\\notepad.exe', params) print 'Process is started.'
Офлайн
Насколько я понял, в последнем примере правильно так:
params =
Однако, с точки зрения Windows-пользователя, извращённая логика :). Первый параметр кажется явно избыточным…
Офлайн
По первому и второму пункту моего вопроса получилось так:
stdOutErr = os.popen4('cd "c:\\Program Files\\" && dir')[1] for line in stdOutErr: print line
Офлайн
Если говорить о запуске внешних приложений и открытии файлов этими приложениями, то почему не упомянули об этом способе:
import os
file = ‘test.txt’
path = os.path.normpath(file)
os.startfile(path)
Офлайн
Все ники занятыsubprocess.Popen help:
По первому и второму пункту моего вопроса получилось так:Остается неясным, как задать текущий каталог. В примере я сделал это искуственно, выполнив предварительно команду “cd”. Есть ли менее “хитрый” способ задать текущий каталог?stdOutErr = os.popen4('cd "c:\\Program Files\\" && dir')[1] for line in stdOutErr: print line
Офлайн
shizaадназначна
subprocess рулит по любому =)
Офлайн
Не понимаю, как правильно воспользоваться subprocess.Popen.
Например, нужно синхронно выполнить команду “dir /Q” в текущем каталоге “C:\Program Files\” и получить её вывод (stdout и stderr, в одном потоке). Вот такой код не работает:
import subprocess stdOutErr = subprocess.Popen(['dir', '/Q'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd='"C:\\Program Files\\"').stdout for line in stdOutErr: print line
Офлайн