2016-07-27 82 views
0

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

输出总是空的。我究竟做错了什么?

见下面的例子:

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] 

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

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

回答

0

问题在于grep%SESSIONNAME%。当你在命令行执行同样的事情时,%SESSIONNAME%实际上被“控制台”取代。 但是,当在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> 

请让我知道,如果它是有帮助的。

+1

我刚刚** ** os.environ [“SESSIONNAME”])**取代**控制台**,但它工作正常。谢谢! –