2017-03-26 1 views
0

J'ai écrit un programme en python utilisant le code suivant:pas de sortie lorsque le fichier python en cours d'exécution en arrière-plan

for item in items: 
     sys.stdout.write("".join(str(i) for i in item)) 
     sys.stdout.write(self.separator) 
     sys.stdout.flush() 

pour imprimer sa sortie.

Quand je lance normalement via le terminal:

[email protected]:~$ ./program.py 

il fonctionne bien.

Aussi quand je le lance et envoyer le stdout vers un fichier:

[email protected]:~$ ./program.py > file 

Mais lorsque je tente de l'exécuter en arrière-plan:

[email protected]:~$ ./program.py > file & 

il ne remplit pas le fichier avec une sortie .

Quelqu'un sait comment le résoudre?

+0

Combien d'articles sont là en 'items'? On dirait un problème de mise en mémoire tampon. – codeforester

+0

Pour le point de @ codeforester pouvez-vous essayer d'exécuter python avec l'indicateur -u pour voir si le buffering est bien le coupable? 'python -u ./program.py> fichier &' – bernie

Répondre

0

Essayez d'exécuter

./program.py > file & 

Au lieu de

./program.py > file $ 
+0

J'utilise &. C'est juste une faute de frappe quand j'ai écrit la question. – Hunry3rd

+0

Ensuite, essayez de donner nohup ./program.py> fichier & – shahin

+0

Ou sudo nohup bash -x programme.py> fichier & – shahin

0

Je résous en supprimant la ligne qui attendant KeyboardInterrupt raw_input() et remplacez-le par sans fin en boucle.

Première question afin de mieux comprendre: Pourquoi cette ligne fait que le processus ne passe pas correctement la sortie quand elle s'exécute en arrière-plan? Ce problème n'apparaît pas lorsqu'il s'exécute en fg.

Maintenant, je dois le tuer fin par le processus

kill -9 PID 

Deuxième question: Comment puis-je vérifier les frappes via son tampon (comme il peut être vérifié en C) sans utiliser le blocage et attendre la fonction entrée brute()?

0

La solution complète:

  1. Rediriger stdin à un fichier vide
  2. Ajoutez le code suivant au programme en cours:

    tout (vrai): essayer: a = raw_input() pour ai dans: si ai == "q": tb.stop() tb.wait()

  3. exécutez le programme avec la commande suivante

    ./program.py < fileSTDIN &

  4. Afin de mettre fin au processus de bg en cours d'exécution, je ne dois écrire 'q' au fichier

    echo "q"> fileSTDIN