2010-09-24 14 views
1

J'ai deux scripts Python qui doivent s'exécuter simultanément car ils interagissent entre eux. Un script est un script 'serveur' s'exécutant localement et l'autre est un script client qui s'y connecte via un socket. Normalement, je viens d'ouvrir quelques onglets de terminal et d'exécuter le script du serveur dans l'un et le client dans l'autre. Après le démarrage et l'arrêt encore et chaque script, je voulais faire un alias bash pour exécuter les scripts avec une seule commande et est venu avec ceci:Erreur SQLite lors du chargement simultané de deux scripts python

gnome-terminal --tab -e "python server.py" --tab -e "python client.py" 

Cependant, maintenant le script serveur soulève une OperationalError sqlite disant qu'une de mes tables de données n'existe pas. Mais quand je cours les manuscrits manuellement tout fonctionne bien. Je n'ai aucune idée de ce qui se passe, mais j'ai pensé que le fait d'exécuter les scripts ensemble ne donnait pas assez de temps au script serveur pour s'initialiser et établir sa connexion à la base de données. Donc, je mets un time.sleep (5) dans le script client, mais dès qu'il commence, j'obtiens la même erreur.

Quelqu'un a une idée de ce qui pourrait se passer? Ou est-ce que quelqu'un connaît des alternatives pour démarrer deux scripts Python avec une commande?

Répondre

0

Essayez de combiner les deux commandes en une seule:

gnome-terminal --tab -x bash -c "python server.py & sleep 5; python client.py" 

Je pense qu'il est préférable de mettre la commande de sommeil (si nécessaire) à l'extérieur client car il peut y avoir des situations où le serveur est déjà lancé et que le client ne pas besoin de dormir.


Le drapeau -x signifie

-x, --execute 
     Execute the remainder of the command line inside the terminal. 

La commande bash appels:

bash -c "python server.py & sleep 5; python client.py" 

bash à son tour, a un drapeau -c qui signifie

-c string If the -c option is present, then commands are read from string. If 
     there are arguments after the string, they are assigned to the posi‐ 
     tional parameters, starting with $0. 

Vous pourrait vouloir expérimenter avec

gnome-terminal --tab -e "python server.py & sleep 5; python client.py" 

Cela pourrait fonctionner aussi. Lorsque vous exécutez bash en premier, votre ~/.bashrc est lu. Sans appeler bash, je pense que par défaut,/bin/sh est appelé à la place.

Si vous obtenez

"socket.error: [Errno 98] Address already in use", 

cela signifie probablement que votre serveur a déjà démarré, et l'exécution du serveur échoue une seconde fois.

+0

Vous voulez 'dormir 5', pas' time 5' dans bash. De plus, vous ne voulez pas envoyer ce sommeil en arrière-plan. Donc: 'python server.py & sleep 5; python client.py' – eumiro

+0

@eumiro: Oups, merci. – unutbu

+0

Je ne comprends pas pourquoi, mais votre solution fonctionne parfaitement! Que font les options -x et -c? Je ne les vois pas dans la page de manuel. – pythonBOI