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

alh*_*alh 12 python python-2.5 python-import

我注意到以下使用Python 2.5.2(使用2.7不会发生):

#!/usr/bin/python

import sys

for line in sys.stdin:
   print line,
Run Code Online (Sandbox Code Playgroud)

输出:

$ echo -e "one\ntwo\nthree" | python test.py
$ one
$ two
$ three
Run Code Online (Sandbox Code Playgroud)

正如所料.但是,如果我导入subprocess到此脚本:

#!/usr/bin/python

import sys
import subprocess

for line in sys.stdin:
   print line,
Run Code Online (Sandbox Code Playgroud)

输出:

$ echo -e "one\ntwo\nthree" | python test.py
$ two
$ three
Run Code Online (Sandbox Code Playgroud)

第一行产出怎么了?

更新:

我想我可能已经发现了问题的根源.我有一个以time.py我的名字命名的文件cwd.time.pyc每次我使用subprocess导入运行脚本时都会创建A ,这表明./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,
Run Code Online (Sandbox Code Playgroud)

time.py

#!/usr/bin/python

import sys

for line in sys.stdin:
   hour = re.search(r'\b([0-9]{2}):', line).group(1)
Run Code Online (Sandbox Code Playgroud)

test.py使用任何类型的输入运行都会导致第一行输出被省略time.pyc并被创建.

小智 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)
Run Code Online (Sandbox Code Playgroud)