Подпроцесс Python.Popen возвращает тот же стандартный вывод, хотя он не должен - PullRequest
1 голос
/ 04 апреля 2009

У меня очень странная проблема с подпроцессом Python. Открыть. Я использую его, чтобы несколько раз вызвать внешний exe-файл и сохранить вывод в списке.

Каждый раз, когда вы вызываете этот внешний exe-файл, он возвращает другую строку . Однако, если я вызову его несколько раз с помощью Popen, он всегда будет возвращать одну и ту же строку . =: - O

Похоже, что Popen всегда возвращает одно и то же значение из stdout, не вызывая 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!

Что, черт возьми, я делаю неправильно?!

Ответы [ 4 ]

3 голосов
/ 14 июля 2009

Возможно (если случайное поведение C_KEY_MAKER основано на текущем времени в секундах и т. П.), Когда вы запускаете его дважды в командной строке, время меняется между выполнениями, и поэтому вы получаете другой вывод, но когда Python запускает его, он запускает его дважды с такой быстрой последовательностью, что время не изменилось, и поэтому он возвращает одно и то же значение дважды подряд.

1 голос
/ 05 апреля 2009

Я не знаю, что не так с вашим примером, я не могу воспроизвести это поведение, но попробуйте более индивидуальный подход:

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
1 голос
/ 04 апреля 2009

Ничего. Это хорошо работает, по моим собственным тестам (кроме вашей ошибки отступа внизу). Проблема либо в вашем exe. или в другом месте.

Чтобы уточнить, я создал программу на python tfile.py

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

А затем изменил программу, чтобы избавиться от проблемы с отступами внизу и вызвать tfile.py. Это дало два разных результата.

0 голосов
/ 04 апреля 2009

Ваш код не является исполняемым, так что вам очень сложно помочь. Попробуйте исправить отступы и синтаксис и сделать их самодостаточными, чтобы мы могли попробовать.

По словам Девина Жанпьера, в Linux все работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...