为什么导入子流程会改变我的输出?

时间:2012-10-29 15:19:37

标签: python python-import python-2.5

我注意到以下使用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。如果删除.pyctime.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被创建。

2 个答案:

答案 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)

2.7之前的

print line,没有推出换行符,所以它覆盖了第一行。丢失逗号,结果将是相同的。