1
ubuntu@ubuntu:/home/ubuntuUser$ cat test.txt 
This is a test file
used to validate file handling programs
#pyName: test.txt
this is the last line
ubuntu@ubuntu:/home/ubuntuUser$ cat test.txt | grep "#pyName"
#pyName: test.txt
ubuntu@ubuntu:/home/ubuntuUser$ "

#1  >>> a = subprocess.Popen(['cat test.txt'], 
                             stdin=subprocess.PIPE,
                             stdout=subprocess.PIPE, 
                             stderr=subprocess.PIPE, 
                             shell=True)
#2  >>> o, e = a.communicate(input='grep #pyName')
#3  >>> print o
#3  This is a test file
#3  used to validate file handling programs
#3  #pyName: test.txt
#3  this is the last line
#3  
#3  >>> 

質問:

Q1:ファイルに対するshell grepコマンドは一致した行だけを出力しますが、grepviasubprocessはファイル全体を出力します。どうしたの?

Q2:Communicate()を介して送信された入力は、最初のコマンド('cat test.txt')にどのように追加されますか?の後#2に、最初のコマンドは「|」の後に通信からの入力文字列によって追加されますか?シェルコマンドは次のようになりcat test.txt | grep #pyNameますか?

4

3 に答える 3

0

おそらく、-functiongrepへの受け渡しcommunicate()はあなたが想定しているようには機能しません。次のようにファイルから直接grepすることで、プロセスを簡略化できます。

In [14]: a = subprocess.Popen(['grep "#pyName" test.txt'], stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr=subprocess.PIPE, shell = True)

In [15]: a.communicate()
Out[15]: ('#pyName: test.txt\n', '')

Pythonでやりたいことをする方がはるかに賢いかもしれません。次のファイルに行がある場合は、その行が印刷されます。

In [1]: with open("test.txt") as f:
   ...:     for line in f:
   ...:         if "#pyName" in line:
   ...:            print line
   ...:            break
   ...:         
#pyName: test.txt
于 2013-03-26T09:43:29.020 に答える
0

あなたがここでしていることは本質的cat test.txt < grep ...にあなたが望んでいることではないようです。パイプラインを設定するには、2つのプロセスを開始し、最初のプロセスのstdoutを2番目のプロセスのstdinに接続する必要があります。

cat = subprocess.Popen(['cat', 'text.txt'], stdout=subprocess.PIPE)
grep = subprocess.Popen(['grep', '#pyName'], stdin=cat.stdout, stdout=subprocess.PIPE)
out, _ = grep.communicate()
print out
于 2013-03-26T09:52:13.440 に答える
0

@prasathは、communicate()を使用する例を探している場合は

[root@ichristo_dev]# cat process.py  -- A program that reads stdin for input
#! /usr/bin/python

inp = 0  
while(int(inp) != 10):  
    print "Enter a value: "  
    inp = raw_input()  
    print "Got", inp  


[root@ichristo_dev]# cat communicate.py
#! /usr/bin/python

from subprocess import Popen, PIPE  

p = Popen("./process.py", stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=True)  
o, e = p.communicate("10")  
print o  


[root@ichristo_dev]#./communicate.py  
Enter a value:   
Got 10
于 2013-03-26T22:15:40.277 に答える