Frage

Ich habe ein sehr seltsames Problem mit Python subprocess.Popen. Ich verwende es mehrmals eine externe exe aufrufen und die Ausgabe in einer Liste zu halten.

Jedes Mal, wenn diese externe exe aufrufen, wird es zurückkehren eine andere Zeichenfolge . Allerdings, wenn ich es mehrmals rufen Popen mit, es wird immer Rückkehr die gleiche Zeichenfolge . =: - O

Es sieht aus wie Popen wird immer den gleichen Wert von stdout zurückkehrt, ohne dass die exe erinnert. tut irgendeine Art von Caching Vielleicht, ohne tatsächlich wieder die EXE-Aufruf.

Dies ist mein Code:

def get_key():

    from subprocess import Popen, PIPE

    args = [C_KEY_MAKER, '/26', USER_NAME, ENCRYPTION_TEMPLATE, '0', ]
    process = Popen(args, stdout=PIPE)
    output = process.communicate()[0].strip()
    return output

if __name__ == '__main__':
    print get_key() # Returns a certain string
    print get_key() # Should return another string, but returns the same!

Was auf der Erde mache ich falsch?!

War es hilfreich?

Lösung

Es ist möglich (wenn C_KEY_MAKER des zufälliges Verhalten auf der aktuellen Zeit in Sekunden basiert, oder ähnliches), dass, wenn Sie es zweimal in der Befehlszeile ausgeführt werden, ist die Zeit zwischen den Läufen geändert in und so erhalten Sie einen anderen Ausgang, aber wenn Python es läuft, läuft es zweimal in solchen schnellen Folge, dass die Zeit nicht geändert hat und so gibt sie den gleichen Wert zweimal in einer Reihe.

Andere Tipps

Nichts. Das funktioniert gut, auf meinen eigenen Tests (abgesehen von Ihrem Einzug Fehler an der Unterseite). Das Problem ist, entweder in Ihrem exe. oder anderswo.

Um zu klären, habe ich ein Python-Programm tfile.py

cat > tfile.py
#!/usr/bin/env python
import random
print random.random()

Und dann veränderte tthe Programm erhalten an der Unterseite des Eindrucks Problem befreien, und tfile.py zu nennen. Es hat zwei verschiedene Ergebnisse liefern.

Ich weiß nicht, was mit Ihrem Beispiel falsch läuft, kann ich dieses Verhalten nicht replizieren, jedoch versuchen, einen by-the-Book-Ansatz:

def get_key():

    from subprocess import Popen, PIPE

    args = [C_KEY_MAKER, '/26', USER_NAME, ENCRYPTION_TEMPLATE, '0', ]
    output = Popen(args, stdout=PIPE).stdout
    data = output.read().strip()
    output.close()
    return data

Der Code ist nicht ausführbar wie so ist es schwer, sie sich als viel zu helfen. Erwägen Befestigungs Vertiefung und Syntax und es in sich geschlossene machen, so dass wir es versuchen können.

Unter Linux es scheint gut zu funktionieren nach Devin Jeanpierre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top