Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中按顺序执行子流程_Python_Unix_Subprocess_Ibm Mq - Fatal编程技术网

在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

我试图在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=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')