我正尝试使用子进程在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
,它的工作原理,并成功得到text
从p.stderr
分配输出,然后在p.stdin.write(..)与'NoneType' object has no attribute 'write'
这为什么会挂起?我试图保持一个子过程可以读取并随意写入。
我想这样做单线程。我的'主'脚本打开python然后循环运行,从用户输入。如果用户输入'r',则从进程读取,如果他们输入'w'则写入进程。
我搜索得越多,测试出的解决方案就越多,看起来好像不可能用python子流程输入输出流。如果我没有传入stdin = PIPE,我可以运行程序并阅读stderr。我也尝试为每个文件指针使用不同的命名文件,但没有成功。
还在为这场战斗而战。就像一个笔记一样,如果任何人都熟悉这个Ruby世界,我想要做的事就是可以使用“ChildProcess”宝石。有一定有使用Python的方式
我建议使用'p.communicate()'而不是直接写入标准输入,而标准输入很容易出现死锁。但是,我看不出这将如何有用。 –
p.communicate()块。我不会让stdin调用,因为它会阻止对stderr.read的调用,尽管输出可用。 – bgura
python版本之间的工作方式有很多不同之处..或者至少以前是这样。你运行的是什么版本的python,你运行的是哪个进程? https://docs.python.org/2/library/subprocess.html#subprocess.Popen.communicate –