Подтвердить что ты не робот

Почему импортный подпроцесс меняет мой результат?

Я заметил следующее, используя Python 2.5.2 (не происходит с использованием 2.7):

#!/usr/bin/python

import sys

for line in sys.stdin:
   print line,

Вывод:

$ echo -e "one\ntwo\nthree" | python test.py
$ one
$ two
$ three

как ожидалось. Однако, если я импортирую subprocess в этот script:

#!/usr/bin/python

import sys
import subprocess

for line in sys.stdin:
   print line,

Вывод:

$ echo -e "one\ntwo\nthree" | python test.py
$ two
$ three

Что случилось с первой строкой вывода?

Update:

Я думаю, что я, возможно, обнаружил корень проблемы. В моем cwd у меня был файл с именем time.py. A time.pyc создается каждый раз при запуске импортированного script с subprocess, предполагая, что ./time.py также импортируется. script работает нормально, если я удалю файлы .pyc и time.py; однако все еще возникает вопрос, почему импорт subprocess приведет к тому, что ./time.py будет импортирован?

Я сузил его еще дальше до точной строки в time.py, что вызывает странное поведение. Я разделил рабочий каталог и содержимое файла на то, что влияет на вывод:

test.py

#!/usr/bin/python

import sys
import subprocess

for line in sys.stdin:
   print line,

time.py

#!/usr/bin/python

import sys

for line in sys.stdin:
   hour = re.search(r'\b([0-9]{2}):', line).group(1)

Запуск test.py с любыми входными результатами в первой строке вывода и time.pyc.

4b9b3361

Ответ 1

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

Это докажет это для вас, если вы хотите протестировать его.

#!/usr/bin/python

import sys

# Test that script was run directly
if __name__=='__main__':
    for line in sys.stdin:
       hour = re.search(r'\b([0-9]{2}):', line).group(1)
else:
    print 'Imported local time.py instead of global time module!'
    sys.exit(1)

Ответ 2

print line, до того, как 2.7 не выпустил новую строку, чтобы перезаписать первую строку. Потеряйте запятую, и результат будет таким же.