我试图了解Python的子流程模块是如何工作的,并且首先给自己设置了一些我想不到的问题。具体来说,我正在尝试与作为子流程创建的Python解释器进行交互。
我创建了一个测试模块,dummy.py
其结构如下:
def hi():
print "Hi Earth"
hi()
然后,为了测试我使用子流程模块的能力,我编写了一个名为的模块pyrun.py
,其结构如下:
import subprocess
def subprocess_cmd1():
outFile = open("tempy1.tmp",'w')
proc = subprocess.Popen("pwd", stdin=subprocess.PIPE, stdout=outFile, stderr=outFile, shell=True)
outFile.close()
def subprocess_cmd2():
outFile = open("tempy2.tmp",'w')
proc = subprocess.Popen('python dummy.py', stdin=subprocess.PIPE, stdout=outFile, stderr=outFile, shell=True)
outFile.close()
def subprocess_cmd3():
outFile = open("tempy3.tmp",'w')
proc = subprocess.Popen('python', stdin=subprocess.PIPE, stdout=outFile, stderr=outFile, shell=True)
proc.communicate('import dummy')
outFile.close()
def subprocess_cmd4():
outFile = open("tempy4.tmp",'w')
proc = subprocess.Popen('python', stdin=subprocess.PIPE, stdout=outFile, stderr=outFile, shell=True)
proc.communicate('import dummy')
proc.communicate('dummy.hi()')
outFile.close()
print "Start"
subprocess_cmd1()
subprocess_cmd2()
subprocess_cmd3()
subprocess_cmd4()
print "Stop"
这个想法是将输入从调用过程发送到子过程,并将所有输出发送到文本文件。
当我尝试从命令行运行pyrun时,得到以下结果:
me@Bedrock1:~/Projects/LushProjects/newCode$ python pyrun.py
Start
Traceback (most recent call last):
File "pyrun.py", line 42, in <module>
subprocess_cmd4()
File "pyrun.py", line 35, in subprocess_cmd4
proc.communicate('dummy.hi()')
File "/usr/lib/python2.7/subprocess.py", line 785, in communicate
self.stdin.write(input)
ValueError: I/O operation on closed file
subprocess_cmd1 - 3
运行而不会崩溃。subprocess_cmd4()
尝试执行以下语句时出现错误:
proc.communicate('dummy.hi()')
这似乎是因为该communicate
方法stdin
在首次使用后会将管道关闭。为什么这样做呢?假设管道应该关闭有什么好处吗?
另外,当我查看tempy3.tmp
(我的输出文件subprocess_cmd3
)的内容时,它缺少Python解释器的“开始”文本-即
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
这是为什么?我将&都 重定向到了。stdout
stderr
outFile
最后,为什么tempy4.tmp
完全是空的?它至少不应该包含崩溃前发送给它的文本吗?(即看起来应该很像tempy3.tmp
)
问题是您如何使用subprocess.communicate()
,它需要一个字符串。来自文档
https://docs.python.org/2/library/subprocess.html
与进程交互:将数据发送到stdin。从stdout和stderr读取数据,直到到达文件末尾。等待进程终止。可选输入参数应该是要发送给子进程的字符串,如果没有数据要发送给子进程,则为None。
试试这个:
def subprocess_cmd4():
outFile = open("tempy4.tmp",'w')
proc = subprocess.Popen('python', stdin=subprocess.PIPE, stdout=outFile, stderr=outFile, shell=True)
proc.communicate('import dummy\ndummy.hi()\n')
outFile.close()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句