如何将bash与python混合使用

11 投票
5 回答
7724 浏览
提问于 2025-04-17 20:58

我非常喜欢使用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 个回答

0

或者可以利用这两种语言的注释和引用功能:

''':'
# 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) !
0

其他人已经回答了你具体的问题,但对于“如何将bash和python混合使用”这个一般性的问题,Xonsh 可能对你有帮助。它是一个特殊的命令行工具,可以让你同时使用python和bash。如果你想在python中方便地调用bash,还有sultan这个工具。

6

不要使用 exec python,直接用 python 就可以了。

这里的 exec 是让系统的命令行窗口用Python解释器替换掉自己,所以在那之后,命令行就不再运行了。

10

不要使用 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!";
14

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!";

撰写回答