Запустите команду оболочки с помощью скрипта Python, дождитесь завершения и вернитесь к скрипту.

StackOverflow https://stackoverflow.com/questions/325463

Вопрос

У меня есть скрипт 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 ())

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top