循环中的python popen管道

时间:2016-07-27 13:10:29

标签: python python-2.7 subprocess popen

我正在尝试编写一个函数来在循环中创建一个shell管道,该循环从列表中获取其命令参数并将最后一个stdout传递给新的stdin。 在和命令列表中,我想调用Popen对象上的通信方法来获取输出。

输出始终为空。我做错了什么?

参见以下示例:

lstCmd = ["tasklist", "grep %SESSIONNAME%", "grep %s" % (strAutName)]
lstPopen = [subprocess.Popen(lstCmd[0].split(), stdout=subprocess.PIPE)]
    for i in range(len(lstCmd) - 1):
        lstPopen.append(subprocess.Popen(lstCmd[i + 1].split(), stdin=lstPopen[i].stdout, stdout=subprocess.PIPE))
        lstPopen[i].stdout.close()
strProcessInfo = lstPopen[-1].communicate()[0]

我在具有其他unix功能的Windows环境中。以下命令适用于我的Windows命令行,应写入strProcessInfo:

C:\>tasklist | grep %SESSIONNAME% | grep tasklist
tasklist.exe                 18112 Console                    1         5.948 K

1 个答案:

答案 0 :(得分:0)

问题在于grep%SESSIONNAME%。当您在命令行上执行相同的操作时,%SESSIONNAME%实际上被“Console”替换。 但是当在python脚本中执行时,它不会被替换。它试图找到不存在的确切%SESSIONNAME%。这就是输出空白的原因。

下面是代码。

Grep 替换为 findstr %SESSIONNAME%替换为“控制台”

import sys
import subprocess

lstCmd = ["tasklist", "findstr Console","findstr tasklist"]
lstPopen = [subprocess.Popen(lstCmd[0].split(), stdout=subprocess.PIPE)]
for i in range(len(lstCmd) - 1):
    lstPopen.append(subprocess.Popen(lstCmd[i + 1].split(), stdin=lstPopen[i].stdout, stdout=subprocess.PIPE))
    lstPopen[i].stdout.close()

strProcessInfo = lstPopen[-1].communicate()[0]
print strProcessInfo

输出:

C:\Users\dinesh_pundkar\Desktop>python abc.py
tasklist.exe                 12316 Console                    1      7,856 K


C:\Users\dinesh_pundkar\Desktop>

如果有帮助,请告诉我。