Подпроцесс Python.Popen возвращает тот же стандартный вывод, хотя это не должно
-
23-08-2019 - |
Вопрос
У меня очень странная проблема с подпроцессом Python.Popen.Я использую его для нескольких вызовов внешнего exe-файла и сохранения вывода в списке.
Каждый раз, когда вы вызываете этот внешний exe, он возвращает другая строка.Однако, если я вызову его несколько раз с помощью Popen, он всегда будет вернуть ТУ ЖЕ строку.=:-О
Похоже, что Popen всегда возвращает одно и то же значение из стандартного вывода, не вызывая exe.Возможно, вы выполняете какое-то кеширование без повторного вызова exe.
Это мой код:
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!
Что, черт возьми, я делаю не так?!
Решение
Это возможно (если C_KEY_MAKER
случайное поведение основано на текущем времени в секундах или аналогичном), что когда вы запускаете его дважды в командной строке, время меняется между запусками, и поэтому вы получаете другой результат, но когда Python запускает его, он запускается он дважды в такой быстрой последовательности, что время не изменилось, и поэтому он возвращает одно и то же значение дважды подряд.
Другие советы
Ничего.По моим собственным тестам это работает нормально (кроме вашей ошибки отступа внизу).Проблема либо в вашем exe.или где-то еще.
Чтобы внести ясность, я создал программу на Python tfile.py.
cat > tfile.py
#!/usr/bin/env python
import random
print random.random()
А затем изменил программу, чтобы избавиться от проблемы с отступами внизу, и вызвать tfile.py.Это дало два разных результата.
Я не знаю, что не так с вашим примером, я не могу воспроизвести это поведение, однако попробуйте более индивидуальный подход:
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
Ваш код не является исполняемым, поэтому вам сложно чем-то помочь.Рассмотрите возможность исправления отступов и синтаксиса и сделайте его автономным, чтобы мы могли попробовать.
По словам Девина Жанпьера, в Linux все работает нормально.