我用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
导入到此脚本中:
#!/usr/bin/python
import sys
import subprocess
for line in sys.stdin:
print line,
输出:
$ echo -e "one\ntwo\nthree" | python test.py
$ two
$ three
第一行输出怎么了?
更新:
我认为我可能已经找到了问题的根源。 我的cwd
中有一个名为time.py
的文件。 每次使用导入subprocess
运行脚本时,都会创建一个time.pyc
,表明./time.py
也被导入了。 如果我删除.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
。
time.py
文件在运行时有输入吗?如果是这样,它可能会消耗你的 "one" 行。通常情况下,出于这个原因,用与标准库中某些东西相同的名称命名自己的模块不是一个好主意! 包可以有所帮助。 - Blckknght