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

标签 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

第一行输出发生了什么?

更新:

我想我可能已经找到了问题的根源。我的 cwd 中有一个名为 time.py 的文件。每次我运行导入了 subprocess 的脚本时,都会创建一个 time.pyc,这表明 ./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

最佳答案

听起来您的本地 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)

关于python - 为什么导入子流程会改变我的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13124488/

相关文章:

python - 什么是指向数组数据开头的 Python 缓冲区对象?

python - 模块导入时出现属性错误 - 在某些计算机上有效

python - 你怎么能找到python从哪里导入了一个特定的模块?

Python 兼容性 : Catching exceptions

python - 从 Arduino 读取字符串

python - 为什么我在 pygame 中的玩家角色有时会消失在瓷砖后面,但仍然会移动?

python - 哪个 Pandas 版本与 Numpy 1.4.1 兼容

python - 根据谷歌风格指南多次导入

python - 属性错误 : '_MainProcess' object has no attribute '_exiting'

python - Python 迭代工具