这个问题是this question的简单版本。
简单来说,我在my_func
上定义了一个自定义bash函数~/.bash_profile
,并使用在同一环境中定义的另外两个bash函数。
此外,my_func
接受两个论点,让我们说a
和b
。 my_func的作用是它连接到远程服务器并发送一些文件(这些文件由a
和b
确定。)
如果我输入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$
答案 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
。