Предполагая, что ваша команда работает в командной строке, а затем удалите аргумент stdout
, изменяя порядок аргументов, и передавая строку вместо списка должно быть достаточно, чтобы сделать его воспроизвести поведение по команде линия.
import subprocess
subprocess.Popen("python ~/mrjobScript.py --domain {1} ~/jobs/{0}/input/* > ~/jobs/{0}/output/output-{1}.log ".format(date,domain), shell=True)
Обратите внимание, что это запустит подпроцесс, а затем перейдет к следующей строке вашего кода. Ваш код не будет ждать его. Если вы хотите, чтобы ваш код дождался его, вы можете вместо этого использовать subprocess.call.
Нота Предупреждение: Рекомендуется, чтобы пользователь shell=True
консультации this answer, чтобы полностью понять последствия такого использования. В частности, такие приложения никогда не должны позволять переданным пользователем аргументам прямо или косвенно передавать аргумент вызова subprocess.Popen
с shell=True
без дезинфекции.
не размещать команду в списке, используя shell = True, также '' 'не будет работать, просто перенаправляя вывод в объект файла –
Поскольку вы пытаетесь вызвать Python с Python, это может иметь больше смысла для простого импорта целевого модуля и непосредственного вызова его функций. Затем вы можете передавать аргументы командной строки гораздо более естественно, чем через подпроцесс и ОС. – merlin2011
@ merlin2011, который не является вариантом с mapreduce (mrjob), или, по крайней мере, я не знаю, как, потому что есть задания, порожденные и т. Д. – nottinhill