Запустите команду оболочки с помощью 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())