如何将bash与python混合使用
我非常喜欢使用Unix命令,但我现在遇到了一些问题,我觉得在里面嵌入Python代码会很有用。这是我的代码:
#!/bin/bash -
echo "hello!";
exec python <<END_OF_PYTHON
#!/usr/bin/env python
import sys
print ("xyzzy")
sys.exit(0)
END_OF_PYTHON
echo "goodbye!";
但是,只有“hello”被打印出来。
$ ./script.sh
hello!
xyzzy
我该如何修改这个bash脚本,以便完全嵌入Python呢?这样的话,能不能把Python中的变量值传递到bash变量里呢?非常感谢。
5 个回答
或者可以利用这两种语言的注释和引用功能:
''':'
# bash code below
echo 'hello world (I am bash) !'
python $0
exit 0 # 'exit' is necessary.
#'''
# python code below
import os, sys
print("hello world (I am python) !")
输出结果:
bash-3.1$ ./bash-with-python
hello world (I am bash) !
hello world (I am python) !
不要使用 exec python
,直接用 python
就可以了。
这里的 exec
是让系统的命令行窗口用Python解释器替换掉自己,所以在那之后,命令行就不再运行了。
不要使用 exec
。因为它会把当前的命令行程序替换成你正在运行的程序,这样后面的脚本就不会继续执行了。
#!/bin/bash -
echo "hello!";
python <<END_OF_PYTHON
#!/usr/bin/env python
import sys
print ("xyzzy")
sys.exit(0)
END_OF_PYTHON
echo "goodbye!";
在 exec python ...
这一行,你实际上是在用 exec()
命令启动 Python 解释器,这样会把 python
的运行环境替换掉 bash
的运行环境,因此 echo "goodbye!"
这行代码根本不会被执行。如果你就是想这样,那没问题;但如果不是的话,就可以去掉这个 exec。
在 Python 代码中的 shebang(“#!”)这一行其实是多余的。当你尝试运行一个普通文件时,系统内核会看到这个“#!”,然后运行后面的内容(比如 /usr/bin/env python
),并把文件的其余部分传给刚刚运行的程序。这是一个用来调用解释器的通用方式。因为你已经自己调用了 Python 解释器,而不是让内核去做这个,所以这行代码既不需要也没有用。
另外,sys.exit(0)
也是多余的,因为 Python 解释器在处理完输入(到达 END_OF_PYTHON
)后会自然退出。这也意味着 import sys
这一行也是不必要的。
总的来说,以下是我建议的代码,以实现你想要的效果:
#!/bin/bash
echo "hello!";
python <<END_OF_PYTHON
print ("xyzzy")
END_OF_PYTHON
echo "goodbye!";