如何使批處理文件按順序執行多個(Python)腳本,每個腳本都在自己的窗口中,並在完成後保持所有窗口打開?現在,我的批處理是這樣的:保持從批處理打開多個控制檯窗口
python script1
start python script2
pause/cmd
但只有父窗口保持打開狀態。
謝謝。
環境: 的Windows XP/Vista的
如何使批處理文件按順序執行多個(Python)腳本,每個腳本都在自己的窗口中,並在完成後保持所有窗口打開?現在,我的批處理是這樣的:保持從批處理打開多個控制檯窗口
python script1
start python script2
pause/cmd
但只有父窗口保持打開狀態。
謝謝。
環境: 的Windows XP/Vista的
[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
)從cmd行輸入'python cps.py script01.py - script02.py'(其中所有三個腳本與python.exe位於同一文件夾中)。這個腳本正確執行了script01,但隨後用'WindowsError:[Error 2]系統找不到指定的文件'。我也嘗試過使用其他文件作爲script02。任何想法可能是什麼問題?回溯是在未來的評論: – beets
回溯是'**文件** 「cpsScript.py」,第32行,在
@beets:'new_window_command '錯了。我已經更新了答案 – jfs
可以使用start
命令打開一個新窗口(與/min
背景),然後運行命令
start "window1" /min cmd.exe /c "pause"
最後一個命令,暫停可以做任何事情,只要一定要把它全部用引號括起來
要保持一個窗口打開,你應該把內容放在一個帶有暫停的批處理腳本中作爲最後一條語句
我想: '啓動 「窗口1」 的cmd.exe/c 「蟒蛇script1.py及暫停」'' 啓動 「窗口2」 的cmd.exe/c 「蟒蛇script2.py與暫停」' 但這個結果在_simultaneous_執行,而不是想要的順序執行。 我也嘗試使用/等待選項,但第一個腳本中的「暫停」命令會停止批處理文件繼續執行下一個腳本。有沒有辦法保持打開的窗口不停止批處理文件? – beets
如果只有兩個腳本,你有正確的想法,只是有你的語法錯誤:
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。
有很多的做這件事的方式。首先提出一些問題:可以讓原始腳本在整個過程中保持活躍狀態嗎?您能否假定您有對某個目錄的寫入權限,例如%TEMP%目錄或包含原始腳本的目錄?讓原始腳本執行「睡眠」可執行文件並輪詢完成python腳本可以嗎?大概需要執行多少個Python腳本,也就是說,有一條巨大的命令行執行它們,還是有太多的命令行是合理的? –
你是否需要將參數傳遞給你的腳本,還是你總是用一個簡單的「python [scriptFileName]」來執行它們? –
對於第一條評論中的所有內容都適用。大約4-8個腳本可能是典型的用法。我願意使用一個巨大的命令行。沒有參數被傳遞。 – beets