在bash脚本中执行Python代码字符串

2 投票
4 回答
6348 浏览
提问于 2025-06-18 04:06

我遇到了一种情况,在我写的bash脚本中使用python会很方便。我在脚本中调用了一些可执行文件,然后想用python做一点简单的数据处理,再继续执行其他操作。为了这点处理,写一个专门的脚本似乎不太划算。

所以我想做的事情大概是这样的:

# do some stuff in bash script
# write some data into datafile.d

python_fragment= << EOF
f = open("datafile.d")
// do some stuff with opened file
print(result)
EOF

result=$(execute_python_fragment $python_fragment) # <- what I want to do

# do some stuff with result

其实我只想执行一段包含python代码的字符串。当然,我可以单独写一个文件,把python代码放进去,然后执行那个文件,但我不太想这样做。我可以用echo $python_fragment > temp_code_file的方式,把代码写入一个临时文件,然后再执行这个临时文件,但这样感觉不太优雅。我就是想直接执行这段字符串,如果可以的话。

我想做的事情看起来很简单,但我还没找到解决办法,也没在网上找到相关的答案。

谢谢!

相关问题:

  • 暂无相关问题
暂无标签

4 个回答

0

如果这个字符串里面包含了完整的Python代码,那么这个简单的 eval() 函数就可以用来执行它。

下面是一个非常简单的例子:

>>> eval("print(2)")
2

希望这对你有帮助。

0

也许可以像这样做:

result=$(echo $python_fragment | python3)

唯一的问题是,问题中的 heredoc 赋值也不管用。不过,这个链接提供了一种方法,如果你想这样做的话:

python_fragment=$(cat <<EOF
print('test message')
EOF
) ;

result=$(echo $python_fragment | python3)

echo result was $result
4

你可以直接在命令行中运行一个Python命令,方法是使用-c这个选项。

python -c 'from foo import hello; print (hello())'

然后在bash中,你可以这样做:

result=$(python -c '$python_fragment')
2

你只需要把这个这里字符串/文档重定向到 python

python <<< "print('Hello')"

或者

python <<EOF
print('Hello')
EOF

把它放在一个函数里。

execute_python_fragment() {
    python <<< "$1"
}

现在你就可以进行你的操作了。

result=$(execute_python_fragment "${python_fragment}")

你还应该添加一些错误控制和输入清理……这取决于你需要在这个函数中达到什么样的安全级别。

撰写回答