在bash中从内联python中读取stdin

时间:2014-12-04 18:35:56

标签: python bash

有人可以解释为什么这个短的bash / python命令不会输出“hello”

$ echo hello | python - <<END
import sys
for line in sys.stdin:
  print line
END

如果我将python脚本保存到文件中,则此命令按预期工作。

在script.py

import sys
for line in sys.stdin:
  print line
END

$ echo“你好”| python script.py

“你好”

3 个答案:

答案 0 :(得分:5)

它不起作用的原因是你有重叠的冲突。 echo | python尝试将标准输入绑定到echo的管道,而python - <<HERE尝试将标准输入绑定到此文档。你不能两者兼得。 (这里的文件胜出。)

但是,没有理由想要在标准输入上管道脚本本身。

bash$ echo hello | python -c '
> import sys
> for line in sys.stdin:
>   print line'
hello

答案 1 :(得分:4)

因为python << END重定向stdin以读取程序。您也无法在stdin上读取echo上传输的线路。

答案 2 :(得分:4)

哦,小伙子,这很有道理!过去一小时我一直在努力解决这个问题,最后我明白了,谢谢你们两位。

要为原始程序提供工作替代方案,您可以执行以下操作:

$ echo hello | python <(cat <<END
import sys
for line in sys.stdin:
  print line
END
)

但要小心!如果你把它放在一个文件中,最后的END需要触及左边的水槽(没有空格)。否则,它不会解析“寻找匹配字符时出现意外的文件结尾”错误或类似错误(实际上,这比我开始回答这个时间还需要两个小时才能弄明白)。

解释代码,发生的事情是<<END ... END<(cat ...)结合创建了一个文件(在/dev/fd中),以便将其提供给python,好像它是一个真实的文件。引用this关于<(...)的说明:

  

这是流程替代。它将命令的输出提供给a   可以像普通文件一样读取的FIFO。

关于这个主题还有另一个有趣的答案here