混合shell和python脚本可能吗?

我发誓我以前见过这个,但现在找不到。 是否有可能有一个shell脚本启动python interpeter“中stream”,即:

#!/bin/bash #shell stuff.. set +e VAR=aabb for i in abc; do echo $i done # same file! #!/usr/bin/env python # python would be given this fd which has been seek'd to this point import sys print ("xyzzy") sys.exit(0) 

你可以使用这个shell语法(在Unix 文档这里称之为文档 ):

 #!/bin/sh echo this is a shell script python <<@@ print 'hello from Python!' @@ 

“<<”运算符之后的标记可以通过任意的标识符,人们经常使用EOF(文件结束)或EOD(文档结束)之类的东西。 如果标记开始一行,那么shell将其解释为程序的输入结束。

你可以写

 exec python <<END_OF_PYTHON #!/usr/bin/env python import sys print ("xyzzy") sys.exit(0) END_OF_PYTHON 

用Python替换Bash进程,并将指定的程序传递给Python的标准输入。 ( exec替换Bash进程, <<END_OF_PYTHON导致标准输入包含所有东西,直到END_OF_PYTHON

如果你的python脚本很短。 您可以使用-c选项将其作为字符串传递给python

 python -c 'import sys; print "xyzzy"; sys.exit(0)' 

要么

 python -c ' import sys print("xyzzy") sys.exit(0) ' 

当然,我发布这个之后,我想起了一个办法:

 #!/bin/sh echo Shell python <<EOF import sys print "Python" sys.exit(0) EOF 

我同意混合/混搭可以是一个相当强大的技术 – 不仅在脚本中,而且在命令行中(例如perl内联已经被证明是非常成功的)。 所以,我在bash / python中混合编写脚本的另一个变种(除了kev提到的)

 for VAR in $(echo 'import sys; print "xyz"; sys.exit(0)' | python -);do echo "$VAR"; done; 

产生

 x y z 

这对于简短的内联脚本/代码非常有用。 如果可以依靠bash脚本作为合适的粘合剂来编写一个大的,好的应用程序,那么可以让不同的团队成员用他们擅长的任何语言编写代码/脚本,然后可以简单地将他们的工作联系起来,如下所示。 当然,也可以假设一个应用程序有很多不同的运行时间。 @ user318904 @phs @piokuc

 #!/bin/bash java hello #hello class bytecode to be in the path python hello.py elixir simple.exs perl hello.pl nodejs sum1.js coffee sum2.coffee #any other bash script can be put anywhere