2016-09-28 43 views
1

我正尝试使用子进程在Python中交互式地运行python。当我运行以下脚本时,它会挂在我从stderr读取的内容上。在Python中以交互方式运行Python

import subprocess 

p = subprocess.Popen('python', shell=True, stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE, stdin=subprocess.PIPE, 
        bufsize=1, universal_newlines=True) 

text = p.stderr.read(256) 
p.stdin.write('exit()\n') 
p.close() 

但是,如果我做一个小小的改变,从构造函数中删除stdin=subproces.PIPE,它的工作原理,并成功得到textp.stderr分配输出,然后在p.stdin.write(..)与'NoneType' object has no attribute 'write'

失败

这为什么会挂起?我试图保持一个子过程可以读取并随意写入。

我想这样做单线程。我的'主'脚本打开python然后循环运行,从用户输入。如果用户输入'r',则从进程读取,如果他们输入'w'则写入进程。

我搜索得越多,测试出的解决方案就越多,看起来好像不可能用python子流程输入输出流。如果我没有传入stdin = PIPE,我可以运行程序并阅读stderr。我也尝试为每个文件指针使用不同的命名文件,但没有成功。

还在为这场战斗而战。就像一个笔记一样,如果任何人都熟悉这个Ruby世界,我想要做的事就是可以使用“ChildProcess”宝石。有一定有使用Python的方式

+0

我建议使用'p.communicate()'而不是直接写入标准输入,而标准输入很容易出现死锁。但是,我看不出这将如何有用。 –

+0

p.communicate()块。我不会让stdin调用,因为它会阻止对stderr.read的调用,尽管输出可用。 – bgura

+0

python版本之间的工作方式有很多不同之处..或者至少以前是这样。你运行的是什么版本的python,你运行的是哪个进程? https://docs.python.org/2/library/subprocess.html#subprocess.Popen.communicate –

回答

0

为“斯文Marnach”说,

Python不打印版权声明如果标准输入连接 到管道

的子说由于没有可供阅读的内容,因此被封锁。通过轮询输出来解决这个问题。