12

我注意到使用 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.pycwd. time.pyc每次我运行导入的脚本时都会创建一个,subprocess这表明./time.py它也在被导入。如果我删除.pyctime.py文件,脚本将正常运行;但是,仍然存在一个问题,为什么subprocess进口也会导致./time.py进口?

我已将其进一步缩小到time.py导致奇怪行为的确切行。我已将工作目录和文件内容剥离为影响输出的内容:

测试.py

#!/usr/bin/python

import sys
import subprocess

for line in sys.stdin:
   print line,

时间.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并被创建。

4

2 回答 2

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)
于 2012-10-30T17:26:47.763 回答
-2

print line,2.7 之前没有换行,所以它覆盖了第一行。丢掉逗号,结果是一样的。

于 2012-10-29T15:34:04.070 回答