subprocess.Popen de Python devuelve la misma salida estándar a pesar de que no debe
-
23-08-2019 - |
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?!
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.