我想了解Python的子進程模塊是如何工作的,並且已經開始設置自己的一些問題,這些問題並不像我想的那麼簡單。具體來說,我試圖與已經創建爲子流程的Python intepreter進行交互。在使用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,我得到如下結果:
[email protected]:~/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
)
無關:爲什麼要使用子進程來運行Python代碼? – jfs
@ J.F.Sebastien - 我真的只是試驗子過程,看看我是否理解如何使用它以及它是如何工作的。我想一個更現實的例子就是使用它來在其他語言的解釋器中運行代碼。 – user1245262
如果它是一個學習exersice那麼這裏有一些提示:1.避免'shell = True',使用列表參數來傳遞命令2.知道如果一個子進程的stdin/stdout/stderr被重定向(例如,在輸出中抑制顏色(ansi代碼)),或者在'python'中沒有標題。 – jfs