【问题标题】:Why does importing subprocess change my output?为什么导入子流程会改变我的输出?
【发布时间】:2012-10-29 15:19:37
【问题描述】:

我在使用 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 中导致奇怪行为的确切行。我已将工作目录和文件内容剥离为影响输出的内容:

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.4.3 上确认: "echo -e "one\ntwo\nthree" | python test.py" 导致最后一个示例为 "-e 一二三"。
  • @tb-:您必须使用 bash shell。 echo 是内置的,并且 tcsh (例如)不支持 -e 标志。
  • 嗯,我实际上根本无法确认这一点:Ubuntu 上的 python2.5.6
  • @sharth 用 bash,结果是一样的(没有 -e)
  • @SilentGhost:我在 Debian 5.0.6 上使用 2.5.2 得到了这些结果。同一台机器上的 Python 2.6.6 和 2.7.1 的行为符合预期。

标签: python python-import python-2.5


【解决方案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)

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 为什么two\n 行没有被覆盖?此外,import subprocess 应该不会影响它。
    • 尾随逗号的行为在 2.7 中没有改变
    • print中尾随逗号的目的是省略换行符,docs.python.org/2/reference/…“末尾写一个'\n'字符,除非打印语句以逗号结尾”
    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 2021-08-02
    • 2016-02-18
    • 1970-01-01
    • 2013-03-17
    • 2013-02-09
    • 1970-01-01
    • 2019-08-06
    相关资源
    最近更新 更多