Запустите команду оболочки с помощью python script, дождитесь завершения и вернитесь к script
У меня есть python script, который должен запустить команду оболочки для каждого файла в каталоге:
import os
files = os.listdir(".")
for f in files:
os.execlp("myscript", "myscript", f)
Это отлично работает для первого файла, но после того, как команда "myscript" завершена, выполнение останавливается и не возвращается к python script.
Как я могу это сделать? У меня есть fork()
до calling os.execlp()
?
Ответы
Ответ 1
subprocess: модуль subprocess
позволяет вам создавать новые процессы, подключиться к их вводу/выводу/ошибке труб и получить их коды возврата.
http://docs.python.org/library/subprocess.html
Использование:
import subprocess
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
process.wait()
print process.returncode
Ответ 2
Вы можете использовать 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()
Ответ 3
Подпроцессный модуль появился с 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 script совместно используют один и тот же stdout). Есть несколько способов избежать этого.
-
check_call( [ 'myscript', f ], stdout=subprocess.PIPE )
Команда stdout будет подавлена (остерегайтесь, если myscript
производит больше 4k вывода). stderr будет показываться, если вы не добавите опцию stderr=subprocess.PIPE
.
-
check_output( [ 'myscript', f ] )
check_output
возвращает stdout как строку, поэтому он не показан. stderr показывается, если вы не добавите опцию stderr=subprocess.STDOUT
.
Ответ 4
Функции os.exec*()
заменяют текущую программу на новую. Когда эта программа заканчивается, так и ваш процесс. Вероятно, вы хотите os.system()
.
Ответ 5
использовать spawn
import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')
Ответ 6
Я использую os.system
import os
os.system("pdftoppm -png {} {}".format(path2pdf, os.path.join(tmpdirname, "temp")))
Ответ 7
это сработало для меня отлично!
shell_command = "ls -l" subprocess.call(shell_command.split())