在python中执行自定义bash函数

时间:2017-11-09 10:18:11

标签: python bash macos shell subprocess

这个问题是this question的简单版本。

简单来说,我在my_func上定义了一个自定义bash函数~/.bash_profile,并使用在同一环境中定义的另外两个bash函数。

此外,my_func接受两个论点,让我们说ab。 my_func的作用是它连接到远程服务器并发送一些文件(这些文件由ab确定。)

如果我输入bash shell: . my_func a b一切正常,我在屏幕上得到了一些打印陈述。

但是,如果我包括: subprocess.call(['#!/bin/bash . my_func a b'], shell=True)似乎没有任何事情发生。

我尝试通过包含:

导出my_func使用的所有bash函数

subprocess.call(['#!/bin/bash export -f my_func'], shell=True)我为my_func使用的其他函数做了同样的事情。

修改

如果我使用subprocess.call(['bash', '-c' ,'my_func a b], shell=True),则bash shell将更改为bash-3.2$

1 个答案:

答案 0 :(得分:1)

你需要在启动python程序之前导出函数

export -f my_func
python foo.py

好吧,如果系统的默认shell(/ bin / sh)不是bash,上面的例子可能不起作用。为了避免这种情况,你可以使用这样的子进程调用:

$ function foo() { echo "bar" ; }
$ export -f foo
$ cat foo.py
import subprocess
subprocess.call(['bash', '-c', 'foo'])
$ python foo.py
bar

<强>替代:

我会把这个函数放到一个lib文件中,让我们说:

# /usr/share/my_lib/my_lib.sh

function my_func() {
    # do something
}

然后我将通过PATH中的脚本公开该函数:

#!/bin/bash
# /usr/local/bin/my_prog

source /usr/lib/my_lib/my_lib.sh
my_func "$1" "$2"

在Python中你只会:

subprocess.call(['/usr/local/bin/my_prog', 'a', 'b'])

顺便说一下:如果你不想在其他地方使用这个功能,你可以直接把它放到/usr/local/bin/my_prog