Pregunta

Estoy teniendo un problema muy extraño con subprocess.Popen de Python. Lo estoy usando para llamar varias veces un exe externa y mantener la salida en una lista.

Cada vez que se llama a este exe externa, devolverá una cadena diferente . Sin embargo, si la llamo varias veces usando Popen, será siempre volver la misma cadena . =: - O

Parece que Popen está volviendo siempre el mismo valor de la salida estándar, sin recordar el exe. Tal vez hacer algún tipo de almacenamiento en caché sin tener que llamar de nuevo el exe.

Este es mi 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!

¿Qué diablos estoy haciendo mal?!

¿Fue útil?

Solución

Es posible (si el comportamiento aleatorio de C_KEY_MAKER se basa en la hora actual en segundos, o similar) que cuando se ejecuta dos veces en la línea de comandos, el tiempo ha cambiado entre carreras y para que pueda obtener una salida diferente, pero cuando pitón lo ejecuta, se ejecuta dos veces en una sucesión tan rápida que no ha cambiado el tiempo y por lo que devuelve el mismo valor dos veces seguidas.

Otros consejos

Nada. Eso funciona bien, en mis propias pruebas (aparte de su error muesca en la parte inferior). El problema está en su exe. o en otro lugar.

Para aclarar, he creado un programa de tfile.py pitón

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

Y a continuación, el programa excedía alterada para deshacerse del problema muesca en la parte inferior, y hacer un llamado tfile.py. Se hizo dar dos resultados diferentes.

No sé lo que está mal con su ejemplo, no puedo replicar este comportamiento, sin embargo probar un enfoque más by-the-libro:

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

El código no es ejecutable como es así que es difícil para ayudarle a salir mucho. Considere reparar la sangría y la sintaxis y lo que es en sí misma, de modo que podamos darle una oportunidad.

En Linux, parece que funciona bien de acuerdo con Devin Jeanpierre.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top