首页 > 解决方案 > 为什么我不能在 python3 子进程中使用导出的 bash 函数?

问题描述

如果我在 bash shell 中运行以下命令:

function tempE(){ echo "This is tempE"; }
export -f tempE
python3 -c "import subprocess as sp; print(sp.run(['tempE'],capture_output=True).stdout.decode('utf8'));"

...然后我希望收到消息“这是 tempE”。相反,我收到一个 python3 错误堆栈,抱怨它找不到tempE. 但我认为这个 python3 进程可以tempE通过export -f tempE.

我有什么误解?

标签: python-3.xbash

解决方案


shell的功能是由shell实现的,所以需要通过shell来执行命令。默认情况下subprocess.run()直接执行程序,所以使用shell=True使其使用shell。

此外,导出的函数是一个bash扩展,但默认subprocess.run()使用sh。用于executable='/bin/bash'覆盖它。

python3 -c "import subprocess as sp; print(sp.run('tempE', shell=True, executable = '/bin/bash', capture_output=True).stdout.decode('utf8'));"

推荐阅读