subprocess.Popen do Python retorna o mesmo stdout mesmo que ele não deveria
-
23-08-2019 - |
Pergunta
Eu estou tendo um problema muito estranho com subprocess.Popen do Python. Eu estou usando-o para chamar várias vezes um exe externo e manter a saída em uma lista.
Cada vez que você chamar este exe externo, ele irá retornar uma corda diferente . No entanto, se eu chamá-lo várias vezes usando Popen, será sempre retornar a string MESMO . =: - O
Parece que Popen está retornando sempre o mesmo valor de stdout, sem recordar o exe. Talvez fazendo algum tipo de cache sem realmente ligar novamente o exe.
Este é meu código:
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!
O que na Terra estou fazendo de errado?!
Solução
É possível (se o comportamento aleatório de C_KEY_MAKER
é baseado no tempo atual em segundos, ou similar) que, quando você executá-lo duas vezes na linha de comando, o tempo mudou em entre as execuções e de modo a obter uma saída diferente, mas quando python executa-lo, ele é executado duas vezes em sucessão tão rápida que o tempo não mudou e por isso retorna o mesmo valor duas vezes seguidas.
Outras dicas
Nada. Esta coima funciona, em meus próprios testes (além de seu erro recuo na parte inferior). O problema é, quer no seu exe. ou em outro lugar.
Para esclarecer, eu criei um programa python tfile.py
cat > tfile.py
#!/usr/bin/env python
import random
print random.random()
E então alterado a reconstrução da casa programa para se livrar do problema de recuo na parte inferior, e para chamar tfile.py. Ele deu dois resultados diferentes.
Eu não sei o que está acontecendo de errado com o seu exemplo, eu não pode replicar esse comportamento, no entanto, tentar uma abordagem mais by-the-book:
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
Seu código não é executável como é por isso é difícil para ajudá-lo muito. Considere fixação recuo e sintaxe e tornando-se auto-suficiente, para que possamos dar-lhe uma tentativa.
No Linux, parece funcionar bem de acordo com Devin Jeanpierre.