2012-07-19 46 views
1

標準輸入輸入我用兩個過程之間subprocess交換數據子不能從其他過程

我編輯repeat.py文件有:

此文件是從http://www.doughellmann.com/PyMOTW/subprocess/

import sys 

sys.stderr.write('repeater.py: starting\n') 
sys.stderr.flush() 

while True: 
    next_line = sys.stdin.readline() 
    if not next_line: 
     break 
    sys.stdout.write(next_line) 
    sys.stdout.flush() 

sys.stderr.write('repeater.py: exiting\n') 
sys.stderr.flush() 
一個例子

並運行此文件ipython

In [1]: import subprocess 

In [2]:  f=subprocess.Popen(['python','~/repeat.py'],shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE) 

In [3]: f.stdin.write('teststs\n') 

In [4]: f.communicate() 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
NameError: name 'teststs' is not defined 
Out[4]: ('', None) 

爲什麼teststs未定義?

+0

@Sven Marnach感謝您的評論,它運行正常後,我刪除'殼=真' – timger 2012-07-19 14:53:10

+0

好 - 我把評論變成了答案。 – 2012-07-19 14:54:21

+0

相關:[不要在子進程中使用list參數和shell = True](http://bugs.python.org/issue21347) – jfs 2014-09-21 16:04:34

回答

3

您似乎開始交互式Python會話而不是運行repeat.py。嘗試刪除shell=True,它與參數列表一起沒有意義。 (順便說一句,使用shell=True幾乎總是一個壞主意。)

-1

這可以在最初5次按鍵操作時出現一些奇怪的現象。我不知道爲什麼。之後,如果工作正常,並且我們有權訪問ls -l,cd,按UP之前的命令,似乎命令行具有全部功能。

#!/bin/python3 

import subprocess 
import sys 

proc = subprocess.Popen(['bash']) 
while True: 
    buff = sys.stdin.readline() 
    stdoutdata, stderrdata = proc.communicate(buff) 
    if(stdoutdata): 
     print(stdoutdata) 
    else: 
     print('n') 
     break 

Here是我的類似問題。