混合shell和python脚本可能吗?

时间:2012-03-05 23:30:11

标签: python linux shell

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

#!/bin/bash
#shell stuff..

set +e

VAR=aabb

for i in a b c; 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)

6 个答案:

答案 0 :(得分:8)

您可以使用此shell语法(在Unix文献中称为 here document ):

#!/bin/sh
echo this is a shell script

python <<@@
print 'hello from Python!'
@@

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

答案 1 :(得分:3)

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

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

或者

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

答案 2 :(得分:2)

你可以写

exec python <<END_OF_PYTHON

import sys

print ("xyzzy")

sys.exit(0)
END_OF_PYTHON

用Python替换Bash进程,并在其标准输入上将指定的程序传递给Python。 (exec取代了Bash流程。<<END_OF_PYTHON会导致标准输入包含END_OF_PYTHON之前的所有内容。)

答案 3 :(得分:0)

当然,在我发布这篇文章之后,我想起了一种方法:

#!/bin/sh

echo Shell

python <<EOF

import sys

print "Python"

sys.exit(0)

EOF

答案 4 :(得分:0)

我同意混合/混搭可能是一种非常强大的技术 - 不仅在脚本中而且在命令行中(例如,perl内联器已被证明随着时间的推移非常成功)。所以我在bash / python中混合脚本的另一个单行变体(除了kev提到)的小技巧:

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

产生

x
y
z

答案 5 :(得分:0)

这对于简短的内联脚本/代码非常有用。如果可以依靠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