2008-11-22 321 views
6

我在一個Windows環境(我的筆記本電腦!)工作,我需要幾個腳本運行其他程序,幾乎像一個Windows批處理文件。python作爲「批處理」腳本(即從python運行命令)

我該如何從python運行一個命令,讓程序運行時會替換腳本?該程序是交互式的(例如,一致),並且始終保持打印線路並詢問用戶輸入。

所以,只運行程序並打印輸出是不夠的。程序必須接管腳本的輸入/輸出,相當於從.bat文件運行命令。

我試過os.execl,但它一直告訴我「無效參數」,並且它沒有找到程序名(不搜索PATH變量);我必須給它完整的路徑..?!

基本上,在一個批處理腳本,我可以寫: 齊聲輪廓

我怎麼能實現在Python同樣的效果?

編輯:

我發現它可以與os.system(...)做,因爲我不能接受我自己的答案,我關閉的問題。


編輯:這應該是一個評論,但是當我發佈它時,我沒有太多的觀點。

感謝Claudiu,這幾乎是我想要的,除了一件小事:我希望函數在程序退出時結束,但是當我一致嘗試它時,它不會將控制權返回給python腳本,但到windows命令行環境下

>>> os.execlp("unison") 

C:\>Usage: unison [options] 
    or unison root1 root2 [options] 
    or unison profilename [options] 

For a list of options, type "unison -help". 
For a tutorial on basic usage, type "unison -doc tutorial". 
For other documentation, type "unison -doc topics". 

C:\> 
C:\> 
C:\> 

如何解決這個問題?

+0

它有助於提供不工作的腳本運行。 – 2008-11-22 23:53:36

+0

有沒有必要關閉這個問題,因爲你不能接受你的答案。如果這是最多的投票,它基本上與接受的一樣..有點令人討厭,誠然,但關閉不是正確的方式,我會說.. – dbr 2008-12-27 03:11:37

回答

6

我發現使用os.system我想要做什麼,

感謝所有那些試圖幫助。

os.system("dir") 

運行命令,就好像它是從一個批處理文件

17

您應該使用subprocess module創建一個新的進程。

我並不熟悉Windows進程,但其Popen功能是跨平臺的,應該被優先選擇OS特定的解決方案。

編輯:我認爲你應該更喜歡子進程模塊操作系統特定的功能,它是跨平臺和更pythonic(只是谷歌它)。您可以等待結果輕鬆了,乾淨

import os 
import subprocess 
unison = os.path.join(os.path.curdir, "unison") 
p = subprocess.Popen(unison) 
p.wait() 
+0

不合理的downvote。 +1 – 2008-11-22 19:01:55

+0

對不起,我的錯。我確信當使用這樣的子進程時不會連接STDIN/STDOUT。顯然現在撤銷我的投票已經太晚了。 – 2008-11-22 23:15:46

2

os.execlp應該工作。這將搜索您的路徑的命令。不要給它任何ARGS,如果他們沒有必要:

>>> import os 
>>> os.execlp("cmd") 

D:\Documents and Settings\Claudiu>Microsoft Windows XP [Version 5.1.2600] 
(C) Copyright 1985-2001 Microsoft Corp. 

D:\Documents and Settings\Claudiu> 
4
import subprocess 

proc = subprocess.Popen(['unison', 'profile'], stderr=subprocess.PIPE,  
         stdout=subprocess.PIPE, stdin=subprocess.PIPE) 

proc.stdin.write('user input') 
print proc.stdout.read() 

這應該幫助您開始。如果您想要更詳細的答案,請使用更多信息編輯您的問題!