我注意到以下使用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
第一行产出怎么了?
更新
我想我可能已经发现了问题的根源。我的time.py
中有一个名为cwd
的文件。每次运行导入time.pyc
的脚本时,都会创建subprocess
,表示还导入了./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
被创建。
答案 0 :(得分:1)
听起来您的本地time.py将被导入而不是全局时间模块。您可能想要重命名它,或者至少开始检查它是作为脚本运行还是作为模块导入。
如果您想测试它,这将为您证明。
#!/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)
答案 1 :(得分:-2)
print line,
没有推出换行符,所以它覆盖了第一行。丢失逗号,结果将是相同的。