2017-09-24 5 views
0

J'ai un bug vraiment étrange que je n'ai pas réussi à résoudre. Je réduit mon code à la quantité minimale pour reproduire le problème:Comportement étrange dans la redirection de Python via le sous-processus

from lxml import etree 
xsd_prs = etree.XMLParser(remove_blank_text=True) 
print "**", xsd_prs 

La commande J'exécute ressemble:

cmd = 'python myprog.py -f myfile.xsd > out.txt 2>&1' 

Quand je lance ce billet depuis la ligne de commande, je reçois ce que je pense à out.txt :

** <lxml.etree.XMLParser object at 0x10b0fd550> 

Cependant, quand je lance ce à partir d'une application Web Python/base de bouteille en utilisant les éléments suivants:

pro = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid) 
pro.wait() 

Ici, la fonction etree.XMLParser() ne renvoie rien. Je viens d'obtenir ce qui suit dans le fichier out.txt:

** 

Je dois aussi mentionner que j'utilise ce même subprocess.Popen() approche pour exécuter toutes sortes de commandes sans faute, à l'exception de celui-ci. Pourquoi la représentation sous forme de chaîne de l'objet n'est-elle pas générée?

J'ai aussi essayé la même chose en utilisant un analyseur XML intégré dans Python:

import xml.etree.ElementTree as ET 
tree = ET.parse(fn) 
doc = tree.getroot() 
print "***", doc 

obtenir un résultat similaire lors de l'exécution de la ligne de commande:

*** <Element '{http://www.w3.org/2001/XMLSchema}schema' at 0x115675f90> 

par rapport à l'exécution de l'application Web:

*** 

Répondre

0

J'ai finalement compris ce qui se passait ici, et ça w pas évident du tout. Lorsque j'ai essayé d'écrire l'objet xsd_prs, casse toute la redirection suivante. La chose folle est que si j'essayais de rediriger l'objet, aucune autre instruction d'impression ultérieure ne redirigerait, il semblait donc que mon programme ne fonctionnait pas du tout. Une fois que j'ai supprimé le print "**", xsd_prs, toutes les chaînes suivantes ayant des représentations de chaîne appropriées peuvent être redirigées.

Je l'ai d'abord découvert en imprimant dir(xsd_prs) qui publie en fait une liste de méthodes que je pourrais appeler sur l'objet, ce qui a prouvé que le XMLParser() renvoyait un objet.

J'ai également trouvé que si je créais un autre fichier de sortie dans mon programme Python, je pourrais écrire la chaîne de représentation de l'objet, mais pas via la redirection.

Si quelqu'un a des liens pour expliquer pourquoi la redirection Python fonctionne de cette façon, je serais intéressé si vous pouviez poster dans les commentaires ci-dessous ou ajouter une réponse plus détaillée.