2011-05-13 83 views
0

一個.cmd文件打開命令窗口有一個名爲STARTUP.CMD文件,設置一些環境變量,運行一些準備命令,然後做:如何控制從使用Python

start "startup" cmd /k 

打開一個命令shell命名爲啓動。我試圖自動執行的手動過程是,然後在此shell中輸入以下命令:get startup.xml。我認爲在Python中這樣做的正確方法是這樣的:

import subprocess 

p = subprocess.Popen('startup.cmd', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) 

getcommand = 'get startup.xml' 
servercommand = 'startserver' 
p.stdin.write(getcommand) 
p.stdin.write(startserver) 
(stdoutdata, stderrdata) = p.communicate() 
print stdoutdata 
print stderrdata 

但是這些命令似乎並沒有在shell中執行。我錯過了什麼?而且,無論shell是否設置爲True或False,命令shell都會出現。

+0

我正在運行一個執行啓動命令的cmd文件 - 在技術上不是一個新的進程,我不是用原來的Popen調用進行控制的嗎? – Nathan 2011-05-13 22:02:24

回答

-1

這是一個新的過程,所以不能直接與Popen進行通信。

+0

對不起:只是不正確。作爲OP並在正確的狀態下回答,可以使用p.stdin.write()或p.communicate()。 – 2012-10-05 10:19:32

1

我發現這個警告在subprocess's document

警告使用通信(),而不是.stdin.write,.stdout.read或.stderr.read避免死鎖由於任何其他操作系統管緩衝區填補和阻止兒童進程。

所以我的建議是使用通信發送您的命令。

import subprocess 

p = subprocess.Popen('startup.cmd', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) 

command = 'get startup.xml\n' 
command += 'startserver\n' 
(stdoutdata, stderrdata) = p.communicate(command) 
print stdoutdata 
print stderrdata 
+0

這似乎並不奏效。我剛剛意識到我正在運行一個執行啓動命令的cmd文件 - 這在技術上不是一個新的進程,我沒有用原來的Popen調用進行控制? – Nathan 2011-05-13 22:03:41

+1

是的,你說得對。這是一個新的過程,所以你不能直接與Popen溝通。如果你的cmd文件不是很複雜,我建議你用python腳本完全替換它。但切記不要使用通信而不是stdin.write。 – ablmf 2011-05-13 22:33:38