2017-09-24 2 views
0

Ich habe einen wirklich seltsamen Fehler, den ich nicht lösen konnte. Ich habe meinen Code auf die minimale Menge minimiert das Problem zu reproduzieren:Seltsames Verhalten in Python-Umleitung über Subprozess

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

Der Befehl I sieht ausführen wie:

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

Wenn ich dies von der Kommandozeile ausführen ich bekommen, was ich in out.txt erwarten :

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

Allerdings, wenn ich dies aus einem Python/Bottle-basierte Web-Anwendung den folgenden verwenden:

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

Hier, etree.XMLParser() Funktion gibt nichts zurück. Bekomme ich nur die folgenden in der out.txt Datei:

** 

ich auch erwähnen sollte, dass ich diesen gleichen subprocess.Popen() Ansatz wurde mit allen Arten von verschiedenen Befehle auszuführen, ohne scheitern, mit Ausnahme von dieser. Warum wird die String-Darstellung des Objekts nicht ausgegeben?

Ich habe auch versucht, die gleiche Sache mit Python integrierten XML-Parser:

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

ähnliches Ergebnis erhalten, sobald eine von der Kommandozeile ausgeführt wird:

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

im Vergleich zu laufen von Web-Anwendung:

*** 

Antwort

0

Ich fand schließlich heraus, was hier vor sich ging, und es w als überhaupt nicht offensichtlich. Als ich versuchte, das xsd_prs Objekt auszuschreiben, unterbricht irgendwie jede nachfolgende Umleitung. Die verrückte Sache ist, dass, wenn ich versuchte, das Objekt umzuleiten, auch keine andere nachfolgende Druckanweisung umgeleitet werden würde, so dass es aussah, als ob mein Programm überhaupt nicht funktionierte. Sobald ich die print "**", xsd_prs entferne, könnten alle folgenden Zeichenfolgen, die richtige Zeichenfolgendarstellungen hatten, umgeleitet werden.

Zuerst entdeckte ich dies durch Drucken dir(xsd_prs), die tatsächlich eine Liste von Methoden ausgeben, die ich auf dem Objekt aufrufen konnte, die tatsächlich bewiesen, dass die XMLParser() ein Objekt zurückgegeben wurde.

Ich fand auch, wenn ich eine andere Ausgabedatei in meinem Python-Programm erstellte, konnte ich die String-Darstellung des Objekts fein schreiben, aber nur nicht über Umleitung.

Wenn jemand irgendwelche Links hat, um zu erklären, warum Python-Umleitung auf diese Weise funktioniert, wäre ich interessiert, wenn Sie in den Kommentaren unten posten oder eine ausführlichere Antwort hinzufügen könnten.