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?!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top