2016-10-04 2 views
0

Я пытаюсь выполнить следующие две команды в python один за другим.Выполнять подпроцесс последовательно в python

runmqsc <Queuem manager name> 
Display QL (<queue name>) 

Я могу выполнить команду rumqsc, используя подпроцесс.

subprocess.call("runmqsc <queue manager name>", shell= True) 

Теперь эти команды, похоже, берут управление из python. Если я попытаюсь выполнить следующую команду, используя подпроцесс, она не работает должным образом. Я даже не уверен, как выполнить второй (для которого я должен передать аргумент).

Добавление фрагмента кода:

subprocess.call("runmqsc Qmgrname", shell= True) 
subprocess.call("DISPLAY QL(<quename>)",shell=True) 

Теперь первая строка выполняет хорошо и как было упомянуто tdelaney в комментариях runmqsc ожидает ввода от стандартного ввода. А после выполнения первой строки программа зависает, даже не выполняя вторую строку.

Любая помощь или ссылки на любой из связанных документов помогут. Благодаря

+0

Можете ли вы сделать это в командной строке? – tdelaney

+0

Runmqsc принимает команды от stdin. Если вы не перенаправляете stdin на канал или вручную вводите команды при запуске программы, он будет зависать и вызов не вернется. Можете ли вы опубликовать небольшой сценарий, показывающий, как вы используете команду, чтобы мы могли предложить исправления? – tdelaney

+0

@tdelaney: Да, я могу запускать команды в командной строке (я имею в виду не использовать подпроцесс). Я пытаюсь выполнить команды сразу один за другим.Пожалуйста, найдите отредактированный вопрос (обновили вопрос с помощью фрагмента кода). Спасибо – Phoenix

ответ

0

Вы надеваете» t нужно последовательно запускать команды подпроцесса. Когда вы запускаете runmqsc в командной строке, он берет на себя stdin, выполняет команды, которые вы вводите, а затем, наконец, выходите, когда вы рассказываете об этом. От the docs:

Принимая stdin с клавиатуры, вы можете вводить команды MQSC в интерактивном режиме. Переадресовывая ввод из файла, вы можете запустить последовательность часто используемых команд, содержащихся в файле. Вы также можете перенаправить выходной отчет в файл.

Но я думаю, что есть третий способ. Начните runmqsc, напишите ваши команды на stdin, затем закройте stdin. Он должен выполнить команды и выйти. Оказывается, Popen.communicate делает это за вас. Я не знаю, хотите ли вы захватить вывод, но в этом примере я разрешаю ему перейти на экран.

# start msg queue manager 
mqsc = subprocess.Popen(["runmqsc", "QMAGTRAQ01"], stdin=subprocess.PIPE, 
    stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
# pass command(s) to manager and capture the result 
out, err = mqsc.communicate("DISPLAY QL(BP.10240.012.REQUEST)") 
# wait for command to complete and deal with errors 
retcode = mqsc.wait() 
if retcode != 0: 
    print("-- ERROR --") # fancy error handling here 
print("OUTPUT: ", out) 
print() 
print("ERROR: ", err) 

В Python3, out и err являются bytes объекты, а не строки. Подобно использованию кодировки при чтении текстового файла, вам, возможно, придется декодировать их на основе любого языка, который использует ваша программа. Допустим, что файл был UTF8, тогда вы бы

out = out.decode('utf-8') 
+0

Большое спасибо. Это работает отлично. Можете ли вы рассказать мне, как я могу поймать вывод mqsc.communicate(). В качестве дополнительного запроса, пожалуйста, предложите некоторые ссылки, где я могу подробно рассказать о Subprocess. – Phoenix

+0

Добавлен код для захвата/ошибки. Ссылка «Popen.communic» в ответе содержится в документах подпроцесса python для более подробной информации. – tdelaney

+0

Спасибо за вашу помощь. – Phoenix

0

на Unix, Linux или Windows, вы можете просто сделать:

runmqsc QMgrName <some_mq_cmds.mqsc> some_mq_cmds.out 

В файле 'some_mq_cmds.mqsc', поместите ваши команды MQSC как:

DISPLAY QL("TEST.Q1")