Подпроцесс Python.Popen возвращает тот же стандартный вывод, хотя это не должно

StackOverflow https://stackoverflow.com/questions/717120

Вопрос

У меня очень странная проблема с подпроцессом 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 все работает нормально.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top