2017-10-08 1 views
1

J'ai écrit un programme (myProg.py) qui utilise un module de sous-processus pour exécuter d'autres programmes python via la fonction d'exécution. J'ai remarqué que arg dans les instructions d'entrée (arg) dans ces autres programmes python ne sont pas affichés sur la console (stdout), tandis que les arguments dans print (args) sont affichés correctement. Cela ne se produit que lorsque j'exécute mon programme via la console. Cela ne se produit pas lorsque j'exécute mon programme via LiClipse.Python subprocess.run avec stderr = subprocess.PIPE redirige l'entrée (texte)

Voici la façon la plus simple de reproduire cette situation:

En utilisant python 3.6.2 et Windows 10

  1. créer un programme Python contenant les deux lignes suivantes et l'enregistrer comme someProgram.py:

a = input("Enter anything") print("a has: " + a)

  1. ouvert cmd, tapez: Type python
  2. : import subprocess
  3. Type
  4. : subprocess.run ([ "python", "path..to..someProgram.py"], stderr = subprocess.PIPE)
  5. Pas ouptut jusqu'à présent, mais l'interprète attend en entrée ... tapez quelque chose et appuyez sur Entrée.
  6. Vous verrez la sortie de l'instruction d'impression.

Si vous supprimez, stderr = subprocess.PIPE vous verrez les sorties correctes.

Maintenant, enregistrez le code des étapes 2 & 3 dans un autre fichier, appelez-le myProg.py dans le même dossier que someProgram.py. Exécutez myProg.py à partir de LiClipse. Vous constaterez que myProg.py s'exécute correctement et produit les sorties correctes.

Mes questions sont les suivantes:

  1. Pourquoi ce problème avec subprocess.run passe
  2. Comment puis-je résoudre ce
  3. Pourquoi y aurait-il une différence entre le code en cours d'exécution à travers et à travers un commandline IDE.

Répondre

1

input fonction d'impression prompt text to stderr, c'est un known issue

vous redirigé stderr donc du texte rapide n'apparaît pas, lorsque vous exécutez de LiClipse, stderr pas redirigés.

vous pourriez invite de sortie par votre auto, comme:

print("Enter anything", end='') 
a = input() 

alternativement, le module import readline avant input, puis input utilisera GNU readline lib (si vous avez), qui imprime à stdout. Alors que dans votre cas, le programme s'exécute comme un sous-processus, vous pouvez toujours réaliser ceci:

python -c "import readline; import runpy; runpy.run_path('/path/to/program.py')" 
+0

Merci d'avoir indiqué le rapport de bogue. J'utilise Windows, donc je vais devoir télécharger et utiliser pyreadline à la place.Connaissez-vous une autre solution de contournement indépendante du système d'exploitation? –

+0

ou, vous pouvez imprimer prompt à stdout par vous-même, mis à jour. – georgexsh

+0

Merci, georgexsh. Malheureusement, cela ne fonctionnerait pas pour mes besoins. –