Как передать вызов подпроцесса в текстовый файл?

subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"])

Теперь у меня есть скрипт, который я запускаю. Когда я запускаю его, и он попадает в эту строку, он начинает печатать, потому что в run.sh есть отпечатки.

Как мне также передать это в текстовый файл? (А также распечатайте, если это возможно)

65 голосов | спросил TIMEX 1 FebruaryEurope/MoscowbTue, 01 Feb 2011 00:54:25 +0300000000amTue, 01 Feb 2011 00:54:25 +030011 2011, 00:54:25

2 ответа


0

Если вы хотите записать вывод в файл, вы можете использовать стандартный вывод -аргумент subprocess.call.

Требуется None, subprocess.PIPE объект файла или дескриптор файла. Первым является значение по умолчанию, stdout наследуется от родителя (ваш скрипт). Второй позволяет передавать данные от одной команды /процесса к другой. Третий и четвертый - то, что вы хотите, чтобы вывод был записан в файл.

Вам нужно открыть файл с чем-то вроде open и передать целое число дескриптора объекта или файла в call:

f = open("blah.txt", "w")
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"], stdout=f)

Я предполагаю, что любой допустимый файлоподобный объект будет работать, как сокет (вздох :)), но я никогда не пробовал.

Как marcog упоминает в комментариях, что вы можете перенаправить также и stderr, вы можете перенаправить его в то же место как стандартный вывод с stderr=subprocess.STDOUT. Любое из вышеупомянутых значений также работает, вы можете перенаправить в разные места.

ответил Skurmedel 1 FebruaryEurope/MoscowbTue, 01 Feb 2011 01:04:47 +0300000000amTue, 01 Feb 2011 01:04:47 +030011 2011, 01:04:47
0

Параметры popen можно использовать в call

args, 
bufsize=0, 
executable=None, 
stdin=None, 
stdout=None, 
stderr=None, 
preexec_fn=None, 
close_fds=False, 
shell=False, 
cwd=None, 
env=None, 
universal_newlines=False, 
startupinfo=None, 
creationflags=0

Итак ...

subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"], stdout=myoutput)

Затем вы можете делать то, что вы хотите, с помощью myoutput (который должен быть файлом между прочим).

Кроме того, вы можете сделать что-то ближе к конвейерному выводу, как это.

dmesg | grep hda

будет:

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

На странице руководства по питону есть много полезной и полезной информации .

ответил ocodo 1 FebruaryEurope/MoscowbTue, 01 Feb 2011 01:01:45 +0300000000amTue, 01 Feb 2011 01:01:45 +030011 2011, 01:01:45

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132