Почему импортный подпроцесс меняет мой результат?
Я заметил следующее, используя 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
.
Ответы
Ответ 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 не выпустил новую строку, чтобы перезаписать первую строку. Потеряйте запятую, и результат будет таким же.