2017-01-09 9 views
1

Я хочу создать абстрактный скрипт, который будет активироваться каждый час и запускать все скрипты из определенного каталога. Не имеет значения, есть ли двое из них или дюжина.Запустите несколько скриптов.py из определенного цикла/dir/in

Когда я бегу

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) 

May эту причину этой проблемы?

Я пробовал с subprocess.call (item) и запускать (item) без везения.

+0

Вы можете просто позвонить 'питон/реж/* py' через' subprocess' или аналогичный; или импортировать все модули и называть их –

ответ

1

subprocess.call - это правильный путь, по моему опыту. Если все, что вы используете, это файлы .py, я думаю, проблема связана с отсутствием python в вашем массиве call. например,

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

И позвольте мне второй @Chris_Rands здесь, я сильно предпочитаю это делается как модуль питона с классом маркера. т.е.

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

с script1.py, script2.py и т.д., в котором сформулирована в run метод на классе, подклассы класса маркера как Runnable. Затем вы можете использовать следующий код для выполнения всех Runnable с в данном каталоге:

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 для получения данных, и по какой-то причине он вызывает исключения в потоке Thread-1 и Thread-2. В нем говорится, что объект, который получает API, не определен. В любом случае это может быть вызвано Windows, и я хочу запустить его на rpi через неделю или около того. Это может быть много ошибок, вызванных этим кросс-os. Спасибо, в любом случае, я рассмотрю этот вариант. –