2017-01-09 1 views
1

Je souhaite créer un script abstrait, qui s'activera toutes les heures et exécutera tous les scripts du répertoire spécifique. Peu importe s'il y en a deux ou une douzaine.Exécution de plusieurs scripts.py à partir d'une boucle/dir/in spécifique

Quand je lance

import os 

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

Il dit qu'il n'y a pas un tel fichier, même si si je les liste (avec impression au lieu de execfile) Je vois tous. J'ai décidé d'obtenir le répertoire exact de chacun d'eux.

import os 

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

Il s'arrête après l'exécution du premier script trouvé. Faisons une boucle while imparable alors.

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())) 

Comment j'étais étonné quand ça ne marchait pas non plus. Encore une fois, seul le premier script trouvé a été exécuté. Donc, la question est, les gars savez-vous comment exécuter tous les scripts en boucle dans un répertoire spécifique sans connaître leurs noms?

Dans chacun de ces scripts j'utilise

return sys.exit(function) 

mai cette cause ce problème?

J'ai essayé avec subprocess.call (item) et run (item) sans chance.

+0

Vous pouvez simplement appeler 'python/dir/* py' via' subprocess' ou similaire; ou importer tous les modules et les appeler –

Répondre

1

subprocess.call est la bonne façon d'y aller, d'après mon expérience. Si tout ce que vous exécutez est .py fichiers, je pense que le problème a à voir avec ne pas avoir python dans votre tableau call. par exemple,

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

Et laissez-moi deuxième @Chris_Rands ici, je préfère fortement ceci étant réalisé en tant que module python avec une classe de marqueur. à savoir,

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

avec script1.py, script2.py, etc., définissant une méthode run sur une classe qui hérite de la classe de marqueur comme Runnable. Ensuite, vous pouvez utiliser le code suivant pour exécuter toutes les Runnable s dans un répertoire donné:

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

Cela semble bien mais je n'ai pas assez de compétences pour créer mon propre module abstrait et il y a quelques choses que je n'obtiens pas dans votre code. Mais je promets que j'y entrerai dans la moitié d'une année! De toute façon, j'essaye d'exécuter ceci avec le sous-processus. Tous sont des scripts '.py'. J'ai oublié de l'écrire, chaque fois que j'utilise 'subprocess.call' j'obtiens' WindowsError: [Erreur 193]% 1 n'est pas une application Win32 valide'. Mais je pense que je vais m'arrêter ici, je veux l'exécuter sur Rpi et actuellement je suis sur Windows, alors peut-être qu'il est plus intelligent de tester le code sur le Pi lui-même. Merci pour votre réponse. –

1

Je n'ai pas le même problème sur mon FS linux. Ainsi, je ne peux essayer de vous donner un code à travailler avec:

Qu'en est-ce.

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

J'utilise api pour obtenir des données et, pour une raison quelconque, il soulève des exceptions dans les threads Thread-1 et Thread-2. Il dit que l'objet qui obtient l'API n'est pas défini. Quoi qu'il en soit, il pourrait être causé par Windows et je veux l'exécuter sur rpi dans une semaine ou deux. Il pourrait y avoir beaucoup plus de bugs causés par ce cross-os. Merci quand même, je vais regarder plus dans cette option. –