2017-01-09 39 views
1

我想製作一個抽象腳本,它將每小時激活一次,並運行特定目錄中的所有腳本。它們中有兩個還是一打併不重要。從特定/ dir/in循環運行多個scripts.py

當我運行

import os 

for item in os.listdir(r'C:/directory/Desktop'): 
    execfile(item) 

它說,有沒有這樣的文件,即使如果我列出了他們(帶打印代替的execfile)我看到所有的人。我決定得到他們每個人的確切目錄。

import os 

for item in os.listdir(r'C:/directory/Desktop'): 
    execfile(r'C:/directory/Desktop/%s'%item) 

運行找到的第一個腳本後停止。然後讓我們做一個不可阻擋的while循環。

import os 

script_list = [] 

for item in os.listdir(r'C:/directory/Desktop'): 
    script_list.append(item) 

while len(script_list) > 0: 
    execfile(r'C:/directory/Desktop/%s'%(script_list.pop())) 

當我沒有工作的時候我有多驚訝。再一次,只有找到的第一個腳本已經被執行。

所以,問題是,你們是否知道如何在特定的目錄中循環運行所有腳本而不知道它們的名字?

在每個腳本我用

return sys.exit(function) 

願這導致這個問題?

我試過subprocess.call(item)並且運行(item)沒有運氣。

+0

你可以只通過調用'subprocess'或類似'蟒蛇/ DIR/* py';或者導入所有模塊並調用它們 –

回答

1

subprocess.call是從我的經驗到這裏的正確方法。如果你正在運行的是.py文件,我認爲這個問題與你的call陣列中沒有python有關。例如,

subprocess.call(['c:/path/to/python', script_list.pop()]) 

讓我第二@Chris_Rands在這裏,我強烈希望能這樣做與標記類的Python模塊。即,

directory 
-- __init__.py 
-- script1.py 
-- script2.py 
-- script3.py 

與script1.py,script2.py等,限定於該子類的標記類像Runnable的類的方法run。然後你可以用下面的代碼在一個給定的目錄中運行的所有Runnable S:

module = import_module('directory') 
for name, klass in inspect.getmembers(module): 
    if name.startswith('__') or not inspect.isclass(klass): continue 
    instance = klass() 
    run_fn = getattr(instance, 'run', None) 
    if run_fn and callable(run_fn): 
     run_fn() 
+0

它看起來不錯,但我沒有足夠的技能來創建我自己的抽象模塊,並且有些東西我沒有在代碼中獲得。但我保證,我會在一年半的時間裏進入它! 無論如何,我試圖用子進程執行此操作。所有這些都是'.py'腳本。我忘了寫它,每當我使用'subprocess.call'我得到'WindowsError:[錯誤193]%1不是有效的Win32應用程序'。但我認爲我只是停留在這裏,我想在Rpi上運行它,而目前我在Windows上運行,所以在Pi上測試代碼也許更聰明。謝謝您的回答。 –

1

我沒有在我的Linux FS同樣的問題。因此,我只能盡力給你一些代碼一起工作:

這個怎麼樣:

import os 
from threading import Thread 

path = "folder/path" 
for item in os.listdir(path): 

    def execFile(): 
     execfile("{:s}/{:s}".format(path,item)) 

    thread = Thread(target = execFile) 
    thread.start() 
    thread.join() 
+0

我使用api來獲取數據,並且由於某種原因它在線程1和線程2中引發了異常。它表示獲取API的對象未定義。無論如何,它可能是由Windows引起的,我想在一週左右的時間內在rpi上運行它。這個cross-os可能會導致更多的bug。無論如何,我會仔細研究這個選項。 –