Запустите команду оболочки с помощью скрипта Python, дождитесь завершения и вернитесь к скрипту.
-
11-07-2019 - |
Вопрос
У меня есть скрипт Python, который должен запускать команду оболочки для каждого файла в каталоге:
import os
files = os.listdir(".")
for f in files:
os.execlp("myscript", "myscript", f)
Это отлично работает для первого файла, но после завершения команды «myscript» выполнение останавливается и не возвращается к сценарию Python.
Как я могу сделать?Должен ли я fork()
до calling os.execlp()
?
Решение
подпроцесс:А
subprocess
Module позволяет вам создавать новые процессы, подключаться к их трубкам ввода/вывода/ошибок и получать их коды возврата.
http://docs.python.org/library/subprocess.html
Использование:
import subprocess
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
process.wait()
print process.returncode
Другие советы
Вы можете использовать subprocess.Popen
. Есть несколько способов сделать это:
import subprocess
cmd = ['/run/myscript', '--arg', 'value']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for line in p.stdout:
print line
p.wait()
print p.returncode
Или, если вам все равно, что на самом деле делает внешняя программа:
cmd = ['/run/myscript', '--arg', 'value']
subprocess.Popen(cmd).wait()
Модуль подпроцессов появился с 2008 года.В частности check_call
и check_output
сделать простые подпроцессы еще проще.А check_*
Семейство функций хорошо тем, что они вызывают исключение, если что-то идет не так.
import os
import subprocess
files = os.listdir('.')
for f in files:
subprocess.check_call( [ 'myscript', f ] )
Любой вывод, генерируемый myscript
будет отображаться так, как если бы ваш процесс выдал результат (технически myscript
и ваш скрипт Python использует один и тот же стандартный вывод).Есть несколько способов избежать этого.
check_call( [ 'myscript', f ], stdout=subprocess.PIPE )
Стандартный вывод будет подавлен (будьте осторожны, еслиmyscript
производит более 4 тыс. продукции).stderr по-прежнему будет отображаться, если вы не добавите опциюstderr=subprocess.PIPE
.check_output( [ 'myscript', f ] )
check_output
возвращает стандартный вывод в виде строки, поэтому он не отображается.stderr по-прежнему отображается, если вы не добавите опциюstderr=subprocess.STDOUT
.
Функции os.exec * ()
заменяют текущую программу новой. Когда эта программа заканчивается, ваш процесс завершается. Вы, вероятно, хотите os.system ()
.
использовать spawn
import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')
Я использую os.system
import os
os.system("pdftoppm -png {} {}".format(path2pdf, os.path.join(tmpdirname, "temp")))
у меня сработало нормально!
shell_command = " ls -l "
subprocess.call (shell_command.split ())
Код>