2009-04-04 7 views
1

J'ai un problème très étrange avec le sous-processus Python de Python. Je l'utilise pour appeler plusieurs fois un exe externe et garder la sortie dans une liste.Le sous-processus de Python.Popen renvoie la même sortie stdout même si elle ne devrait pas

Chaque fois que vous appelez cet exe externe, il renvoie une chaîne différente. Cependant, si je l'appelle plusieurs fois en utilisant Popen, il retournera toujours la même chaîne. =: - O

Il semble que Popen renvoie toujours la même valeur à partir de stdout, sans rappeler l'exe. Peut-être faire une sorte de mise en cache sans réellement rappeler l'exe.

Ceci est mon 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! 

Que diable suis-je tort ?!

+0

Lorsque vous exécutez la commande C_KEY_MAKER deux fois - directement sur la ligne de commande - que produit-elle? –

+0

Deux chaînes différentes, comme prévu. – cfischer

+0

@Fernando: En fait pas prévu par moi. J'ai mes doutes que l'application de ligne de commande a des graines de nombres aléatoires appropriés. Il doit y avoir une différence de variable d'environnement entre le sous-processus et la version de ligne de commande. –

Répondre

3

Il est possible (si aléatoire de C_KEY_MAKER comportement est basé sur l'heure actuelle en secondes, ou similaire) que lorsque vous l'exécutez deux fois sur la ligne de commande, le temps a changé entre les exécutions et donc vous obtenez une sortie différente, mais quand python l'exécute, il l'exécute deux fois telle succession rapide que le temps n'a pas changé et donc il retourne la même valeur deux fois de suite.

1

Rien. Cela fonctionne bien, sur mes propres tests (en dehors de votre erreur d'indentation au fond). Le problème est soit dans votre exe. ou ailleurs.

Pour clarifier, je créé un programme python tfile.py

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

Et puis le programme tle modifié pour se débarrasser du problème de retrait au fond, et d'appeler tfile.py. Cela a donné deux résultats différents.

+0

Je cours sous Windows, est-ce que ça pourrait être le problème? – cfischer

+0

C'est possible, mais j'en doute. Vous pourriez exécuter un tel exemple vous-même et voir si quelque chose d'étrange surgit, mais ce serait un bug sérieux dans le module de sous-processus - il devrait fonctionner de manière identique sous Linux et Windows, et devrait fonctionner comme sur mon ordinateur. –

0

Votre code n'est pas exécutable comme il est donc il est difficile de vous aider beaucoup. Envisager de fixer l'indentation et la syntaxe et de la rendre autonome, afin que nous puissions essayer.

Sur Linux, cela semble fonctionner correctement selon Devin Jeanpierre.

1

Je ne sais pas ce qui va mal avec votre exemple, je ne peux pas reproduire ce problème, essayez cependant un plus par le livre approche:

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 
Questions connexes