Как мне создать подпроцесс в Python?
Я хотел бы создать подпроцесс процесса.
Каким будет рабочий пример, показывающий, как этого добиться?
5 ответов
Начните с документации подпроцесса.
Если вы хотите получить вывод:
>>> import subprocess
>>> output = subprocess.Popen(['uname', '-a'], stdout=subprocess.PIPE).communicate()[0]
>>> output
'Linux'
Если вы просто хотите позвонить, а не иметь дело с выводом:
>>> subprocess.call(['echo', 'Hi'])
Hi
0
subprocess.check_call - то же самое, за исключением того, что CalledProcessError
если команда вызвана с неверными параметрами.
Запуск и мониторинг подпроцесса:
import subprocess, time, os, signal
args=['/usr/bin/vmstat','-n','2']
app=subprocess.Popen(args=args, stdout=open('somefile','w'))
print "Your app's PID is %s. You can now process data..." % app.pid
time.sleep(5)
if app.poll() == None: print "Process is still running after 5s."
print "The app outputed %s bytes." % len(open('somefile','r').read())
print "Stopping the process..."
os.kill(app.pid, signal.SIGTERM)
Это еще не все. Просто проверьте документы Popen.
Это то, что работает для меня, если вы хотите запустить простую команду вместо того, чтобы дать отдельный файл
import subprocess
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
process.wait()
print process.returncode
Чтобы получить код возврата процесса вы можете использовать process.returncode
Чтобы получить ответ вы можете использовать process.communicate()
в случае, если вы запутались, вы можете просто проверить этот код с помощью command="ls"
если вы получаете returncode
Кроме как 0
тогда вы можете проверить, что означает этот код ошибки: http://tldp.org/LDP/abs/html/exitcodes.html
Для получения дополнительной информации о подпроцессе: http://docs.python.org/library/subprocess.html
if os.name == 'nt':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW
subprocess.call(os.popen(tempFileName), shell=True)
os.remove(tempFileName)
Основываясь на ответе пользователя user225312, я подготовил следующий вкладыш, который может помочь вам протестировать подпроцесс:
python -c "import subprocess;
output = subprocess.Popen(['uname', '-a'], stdout=subprocess.PIPE).communicate()[0];
print output"
результат как:Linux xxx.xxx.xxx.xxx 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux