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

1

У меня очень странная проблема с подпроцессом Python.Popen. Я использую его, чтобы вызывать несколько раз внешнее 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!

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

  • 0
    Когда вы запускаете команду C_KEY_MAKER дважды - непосредственно в командной строке - что это дает?
  • 0
    Две разные строки, как и ожидалось.
Показать ещё 1 комментарий
Теги:
subprocess
stdout
popen

4 ответа

3
Лучший ответ

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

1

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

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

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

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

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

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

  • 0
    Я работаю на Windows, это может быть проблемой?
  • 0
    Это возможно, но я сомневаюсь в этом. Вы можете запустить такой пример самостоятельно и посмотреть, возникнет ли что-нибудь странное, но это будет серьезной ошибкой в модуле подпроцесса - он должен работать одинаково в Linux и Windows, и он должен работать так же, как на моей машине.
0

Ваш код не является исполняемым, так как вам сложно много помочь. Рассмотрите возможность фиксации отступов и синтаксиса и сделать его самодостаточным, чтобы мы могли попробовать.

В Linux, похоже, работает отлично в соответствии с Девином Жанпьером.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню