2017-03-28 339 views
1

我正在使用Python腳本,並且在延遲Bash腳本執行時遇到了一些問題。如何在Python中延遲執行腳本?

我的script.py讓用戶選擇一個script.sh,並且在修改該腳本之後,用戶可以使用各種選項運行它。

其中一個選項是延遲N秒執行腳本的可能性,我使用time.sleep(N)但script.py完全停止N秒,我只是想延遲N秒的script.sh,讓用戶繼續使用script.py。

我搜索的答案沒有成功,有什麼想法?

+1

我想你想*叉*不同的工藝,睡在這個過程中,然後* EXEC *的bash腳本 –

+0

如果你使用'subprocess'模塊,並創建自己的'Popen'對象,你的'bash'腳本不會被阻塞,你可以在'sleep'命令的開頭。 – kindall

+0

[Celery](http://www.celeryproject.org/)是一個可用於在Python中調度任務(任意函數調用)的框架。 –

回答

2

您可以在新線程中啓動腳本,在運行之前進行休眠。

小例子:

import subprocess as sp 
from threading import Thread 
import time 

def start_delayed(args, delay): 
    time.sleep(delay) 
    sp.run(args) 

t = Thread(target=start_delayed, kwargs={'args': ['ls'], 'delay': 5}) 
t.start() 
+0

這與'threading.Timer'在標準庫中已經提供的有什麼不同? –

+0

(順便說一句,你在一個地方有'so',在另一個地方有'sp'')。 –

+0

謝謝,它完美的作品! – mao95

0

在調用script.sh之前,您應該使用subprocess.Popen運行睡眠。

+2

你爲什麼要這麼做?它比使用'time.sleep()'要高得多。 –

+0

......據我瞭解,OP對'time.sleep()'的論點是它綁定了它們的Python腳本的執行流程,但是阻塞在一個子流程上將會執行同樣的事情。 –

0

考慮使用Timer對象從threading module

import subprocess, threading 
t = threading.Timer(10.0, subprocess.call, args=(['script.sh'],)) 
t.start() 

... 10秒延遲後上述運行script.sh


或者,如果你想有效地能夠控制它們運行的​​計劃任務的任意數,只有一個線程,可以考慮使用scheduler從TANDARD庫sched module

import sched, subprocess 

s = sched.scheduler(time.time, time.sleep) 
s.enter(10, subprocess.call, (['script.sh'],)) 
s.run() 

這將在經過10秒鐘後運行script.sh - 儘管如果您希望它在後臺運行,您可能希望自己將其放入一個線程(或多個)中。