2012-08-25 204 views
3

如何使批處理文件按順序執行多個(Python)腳本,每個腳本都在自己的窗口中,並在完成後保持所有窗口打開?現在,我的批處理是這樣的:保持從批處理打開多個控制檯窗口

python script1 
start python script2 
pause/cmd 

但只有父窗口保持打開狀態。

謝謝。

環境: 的Windows XP/Vista的

+0

有很多的做這件事的方式。首先提出一些問題:可以讓原始腳本在整個過程中保持活躍狀態​​嗎?您能否假定您有對某個目錄的寫入權限,例如%TEMP%目錄或包含原始腳本的目錄?讓原始腳本執行「睡眠」可執行文件並輪詢完成python腳本可以嗎?大概需要執行多少個Python腳本,也就是說,有一條巨大的命令行執行它們,還是有太多的命令行是合理的? –

+0

你是否需要將參數傳遞給你的腳本,還是你總是用一個簡單的「python [scriptFileName]」來執行它們? –

+0

對於第一條評論中的所有內容都適用。大約4-8個腳本可能是典型的用法。我願意使用一個巨大的命令行。沒有參數被傳遞。 – beets

回答

2

[to] execute multiple (Python) scripts sequentially, each in their own window, and keep all those windows open upon completion

#!/usr/bin/env python 
"""Continuation-passing style (CPS) script. 

Usage: 

    $ python cps.py script1.py arg1 arg2 -- script2.py a b c -- script3.py ... 
""" 
import platform 
import sys 
from subprocess import call 

if len(sys.argv) < 2: 
    sys.exit() # nothing to do 

# define a command that starts new terminal 
if platform.system() == "Windows": 
    new_window_command = "cmd.exe /c start cmd.exe /c".split() 
else: #XXX this can be made more portable 
    new_window_command = "x-terminal-emulator -e".split() 

# find where script args end 
end = sys.argv.index('--') if '--' in sys.argv else len(sys.argv) 

# call script; wait while it ends; ignore errors 
call([sys.executable] + sys.argv[1:end]) 

# start new window; call itself; pass the rest; ignore errors 
rest = sys.argv[end+1:] 
if rest: 
    call(new_window_command + [sys.executable, sys.argv[0]] + rest) 

print("Press Enter to exit") #NOTE: to avoid raw_input/input py3k shenanigans 
sys.stdin.readline() 

它支持他們的論據儘可能多的腳本,你可以在命令行上提供。

如果您不使用腳本參數;你可以簡化使用:

$ python cps.py script1.py script2.py script3.py 

注意:沒有--之間的腳本。您需要修改的代碼在這種情況下:

  • 設置end = 2
  • rest = sys.argv[end:](注:沒有+1
+0

從cmd行輸入'python cps.py script01.py - script02.py'(其中所有三個腳本與python.exe位於同一文件夾中)。這個腳本正確執行了script01,但隨後用'WindowsError:[Error 2]系統找不到指定的文件'。我也嘗試過使用其他文件作爲script02。任何想法可能是什麼問題?回溯是在未來的評論: – beets

+0

回溯是'**文件** 「cpsScript.py」,第32行,在 呼叫(new_window_command + [sys.executable,sys.argv中[0]] +靜止) ** File **「c:\ Python27 \ lib \ subprocess.py」,第493行,致電 返回Popen(* popenargs,\ ** kwargs).wait() ** File **「c:\ Python27 \ lib \ subprocess.py「,第679行,在_init__ errread,errwrite) **文件**」c:\ Python27 \ lib \ subprocess.py「,行896,在_execute_child startupinfo)' – beets

+0

@beets:'new_window_command '錯了。我已經更新了答案 – jfs

0

可以使用start命令打開一個新窗口(與/min背景),然後運行命令

start "window1" /min cmd.exe /c "pause" 

最後一個命令,暫停可以做任何事情,只要一定要把它全部用引號括起來

要保持一個窗口打開,你應該把內容放在一個帶有暫停的批處理腳本中作爲最後一條語句

+0

我想: '啓動 「窗口1」 的cmd.exe/c 「蟒蛇script1.py及暫停」'' 啓動 「窗口2」 的cmd.exe/c 「蟒蛇script2.py與暫停」' 但這個結果在_simultaneous_執行,而不是想要的順序執行。 我也嘗試使用/等待選項,但第一個腳本中的「暫停」命令會停止批處理文件繼續執行下一個腳本。有沒有辦法保持打開的窗口不停止批處理文件? – beets

2

如果只有兩個腳本,你有正確的想法,只是有你的語法錯誤:

start cmd.exe /k "python script1.py & start cmd.exe /k python script2.py" 

如果你需要的窗口標題:

start "Window1" cmd.exe /K "python script1.py & start "window2" cmd.exe /K python script2.py" 

任何兩個以上的腳本和你將不得不採取棘手的東西。下面.cmd文件將這樣的伎倆:

@echo off 
if "%~1" == "recurse" goto runScript%~2 

start "Window1" cmd /k "%~f0 recurse 1" 
exit /b 0 

:runScript1 
python script1.py 
start "Window2" cmd /k "%~f0 recurse 2" 
exit /b 0 

:runScript2 
python script2.py 
start "Window3" cmd /k "%~f0 recurse 3" 
exit /b 0 

:runScript3 
python script3.py 
exit /b 0 

這可擴展到任意數量的腳本或命令的,任意參數給腳本等,如果你想在CMD窗口只是暫停,而消失當您按下一個鍵:

@echo off 
if "%~1" == "recurse" goto runScript%~2 

start "Window1" cmd /c "%~f0 recurse 1" 
exit /b 0 

:runScript1 
python script1.py 
start "Window2" cmd /c "%~f0 recurse 2" 
pause 
exit /b 0 

:runScript2 
python script2.py 
start "Window3" cmd /c "%~f0 recurse 3" 
pause 
exit /b 0 

:runScript3 
python script3.py 
pause 
exit /b 0 

如果你希望它們都在一個關鍵的最後一個窗口上的新聞立即終止:

@echo off 
if "%~1" == "recurse" goto runScript%~2 

start "Window1" cmd /c "%~f0 recurse 1" 
exit /b 0 

:runScript1 
python script1.py 
start "Window2" /wait cmd /c "%~f0 recurse 2" 
exit /b 0 

:runScript2 
python script2.py 
start "Window3" /wait cmd /c "%~f0 recurse 3" 
exit /b 0 

:runScript3 
python script3.py 
pause 
exit /b 0 

所以,你有很多的行爲調查選項腳本的r。

+0

雙腳本選項效果很好。出於好奇,這是否可以嵌套在兩個腳本之外,還是除了可讀性之外還有一些障礙? 明天我會嘗試更通用的解決方案。謝謝! – beets

+0

如果你可以找出引號的轉義規則,你可以使用Python生成命令行:print reduce(lambda cmd,script:r'start cmd.exe/k「python%s&%s」'(腳本, cmd),反轉(「1.py 2.py 3.py 4.py」.split()),「echo done」)' – jfs

+0

cmd.exe在解析和匹配引號方面表現不佳,甚至更差的作業解析和匹配括號。我無法讓它做3個腳本,因此其他代碼。 –

相關問題