2014-06-11 2 views
2

Je voudrais créer un simple programme Python qui exécutera simultanément deux scripts indépendants. Pour l'instant, les deux scripts impriment juste une séquence de nombres mais mon intention est d'utiliser ce programme pour exécuter simultanément quelques programmes de streaming Twitter dans le futur.Exécution de plusieurs scripts Python

Je suppose que je dois utiliser subprocess.Popen mais je n'arrive pas à comprendre quels arguments je devrais mettre là. Il y avait une question similaire sur StackOverflow mais le code fourni ici (collé ci-dessous) n'imprime rien. J'apprécierai votre aide.

Mes fichiers sont:

Comme mentionné Wanderlust

thread1.py
thread2.py

import subprocess 

subprocess.Popen(['screen', './thread1.py'])) 
subprocess.Popen(['screen', './thread2.py']) 
+1

N'est-il pas plus simple et plus évident d'exécuter des processus parallèles en utilisant des pipelines sous Unix? I.e. '' ./thread1.py; ./ thread2.py'' – wanderlust

+0

Oui, un pipeline de processus Unix normal fera l'affaire. Alors que juste un heads-up, si les opérations sont liées entre elles, vous devriez envisager d'utiliser des threads sur les processus en Python. –

+0

Merci, j'ai essayé ce que vous avez suggéré: python ./thread1.py;./thread2.py mais je ne reçois que les numéros imprimés du premier script et je voudrais que les deux scripts fonctionnent en même temps temps. – user3722736

Répondre

1

, pourquoi voulez-vous faire de cette façon et non via la ligne de commande linux?

Sinon, la solution que vous postez fait ce qu'il est censé, par exemple, vous faites cela à la ligne de commande:

screen ./thread1.py 
screen ./thread2.py 

Cela ouvrira une session écran et exécuter le programme et la sortie dans ce session d'écran, de sorte que vous ne verrez pas la sortie sur votre terminal directement. Pour tirer votre sortie du mal, il suffit d'exécuter les scripts sans l'appel de l'écran:

import subprocess 

subprocess.Popen(['./thread1.py']) 
subprocess.Popen(['./thread2.py']) 

Contenu de thread1.py:

#!/usr/bin/env python 
def countToTen(): 
    for i in range(10): 
    print i 

countToTen() 

Contenu de thread2.py:

#!/usr/bin/env python 
def countToHundreds(): 
for i in range(10): 
    print i*100 

countToHundreds() 

Puis don oubliez pas de le faire sur la ligne de commande:

chmod u+x thread*.py 
+0

Merci, j'ai essayé d'utiliser le script ci-dessus (dans IDLE) mais j'ai eu beaucoup d'erreurs. Traceback (dernier appel en dernier): ligne 3, en subprocess.Popen (['./ thread1.py']) Fichier "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7 /subprocess.py ", ligne 709, dans __init__ errread, errwrite) Fichier" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py ", ligne 1326, dans _execute_child child_exception OSError: [Errno 13] Autorisation refusée – user3722736

+0

Ceci est très probablement lié au contenu de votre 'thread1' et 'thread2'. Pouvez-vous donner des détails? – jonnybazookatone

+0

Bien sûr, j'ai obtenu la solution UNIX pour fonctionner, mais je suis curieux de savoir ce qui ne va pas avec mon sous-processus.Popen. Voici thread1: 'def countToTen(): pour i dans la gamme (10): impression i countToTen()' et thread2: 'def countHundreds(): pour i dans la gamme (10): impression i * 100 countHundreds() 'Je reçois des erreurs lorsque j'exécute ce code:' sous-processus d'importation sous-processus.Popen (['thread1.py']) sous-processus.Popen (['thread2.py']) 'PS Désolé pour ma mauvaise mise en forme, j'ai besoin d'apprendre comment formater ici – user3722736

1

Utiliser supervisord

supervisord est un système de contrôle de processus destiné uniquement à l'exécution de plusieurs scripts de ligne de commande.

Il dispose:

  • multiples processus contrôlés
  • autorestarting échoué fonctionne
  • stdout journal et stderr sortie
  • scripts à partir dans l'ordre (en utilisant la priorité)
  • utilitaire de ligne de commande pour afficher le dernier journal de sortie, arrêter, démarrer, redémarrer les processus

Cette solution fonctionne uniquement sur les systèmes basés sur * nix, elle n'est pas disponible sous Windows.

1

Vous pouvez aussi ouvrir plusieurs fenêtres d'invite de commande pour exécuter plusieurs programmes Python à la fois - il suffit d'exécuter un dans chacun d'eux:

Dans chaque fenêtre Invite de commandes, allez dans le répertoire approprié (par exemple C:/Python27), puis tapez 'python YourCodeNo .py 'dans une fenêtre d'invite de commande,' python YourCodeNo .py 'dans le prochain ect. .

Je cours actuellement 3 codes de cette manière, sans ralentir aucun d'entre eux.

+0

Voir http://comments.gmane.org/gmane.comp.python.tutor/77257 – LinnK

Questions connexes