在python中按顺序执行子流程
我试图在python中一个接一个地执行以下两个命令在python中按顺序执行子流程,python,unix,subprocess,ibm-mq,Python,Unix,Subprocess,Ibm Mq,我试图在python中一个接一个地执行以下两个命令 runmqsc <Queuem manager name> Display QL (<queue name>) runmqsc 显示QL() 我可以使用subprocess执行rumqsc命令 subprocess.call("runmqsc <queue manager name>", shell= True) subprocess.call(“runmqsc”,shell=Tru
runmqsc <Queuem manager name>
Display QL (<queue name>)
runmqsc
显示QL()
我可以使用subprocess执行rumqsc命令
subprocess.call("runmqsc <queue manager name>", shell= True)
subprocess.call(“runmqsc”,shell=True)
现在,这些命令看起来像是从python手中夺取了控制权。如果我尝试使用subprocess执行下一个命令,它将无法按预期工作。
我甚至不知道如何执行第二个(为此我必须传递一个参数)
添加代码段:
subprocess.call("runmqsc Qmgrname", shell= True)
subprocess.call("DISPLAY QL(<quename>)",shell=True)
subprocess.call(“runmqsc Qmgrname”,shell=True)
调用(“DISPLAY QL()”,shell=True)
现在,第一行执行良好,正如tdelaney在注释runmqsc中提到的,它等待来自stdin的输入。在执行第一行之后,程序挂起,甚至不执行第二行
任何帮助或对任何相关文档的引用都会有所帮助。
感谢您在Unix、Linux或Windows上执行以下操作:
runmqsc QMgrName < some_mq_cmds.mqsc > some_mq_cmds.out
您不希望按顺序运行子流程命令。当您在命令行上运行
runmqsc
时,它将接管stdin
,执行您输入的命令,然后在您告诉它时最终退出。发件人:
通过从键盘获取stdin,可以交互地输入MQSC命令。
通过重定向文件中的输入,可以运行一系列
文件中包含的常用命令。您还可以重定向
将输出报告转换为文件
但我认为还有第三条路。启动runmqsc
,将命令写入stdin
,然后关闭stdin
。它应该执行命令并退出。事实证明这是为你做的。我不知道您是否想要捕获输出,但在本例中,我让它进入屏幕
# 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
是字节
对象,而不是字符串。与读取文本文件时使用编码类似,您可能需要根据程序使用的任何语言对其进行解码。假设文件是UTF8,那么
out = out.decode('utf-8')
可以在命令行上执行此操作吗?Runmqsc从stdin获取命令。如果在运行程序时不将stdin重定向到管道或手动键入命令,它将挂起,调用将不会返回。你能发布一个小脚本,说明你是如何执行命令的,这样我们就可以建议修复方法了吗?@tdelaney:是的,我可以在命令行中运行命令(我的意思是不使用子进程)。我试图一个接一个地直接执行命令。请查找已编辑的问题(已使用代码段更新了问题)。非常感谢。这非常有效。您能指导我如何捕获mqsc.Communication()的输出吗。作为一个额外的请求,请建议一些链接,我可以在其中详细介绍子流程。添加了捕获代码/err。答案中的Popen.communicate链接指向python子流程文档以获取更多详细信息。感谢您的帮助。
out = out.decode('utf-8')