我注意到以下使用 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
也被导入了。如果我删除 .pyc
和 time.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/