如何从python调用shell脚本函数/变量?

如何从python调用shell脚本函数/变量?,python,bash,Python,Bash,有没有办法调用shell脚本并使用python脚本中定义的函数/变量 脚本是unix_shell.sh #!/bin/bash function foo { ... } 可以从python调用这个函数foo吗 解决方案: 对于函数:将Shell函数转换为python函数 对于shell局部变量(非导出),在调用python脚本之前,在shell中运行此命令: 导出$(设置为| tr'\n'') 对于shell全局变量(从shell导出),在python中,您可以: 导入操作系统 打印操作系统环

有没有办法调用shell脚本并使用python脚本中定义的函数/变量

脚本是unix_shell.sh

#!/bin/bash
function foo
{
...
}
可以从python调用这个函数foo吗

解决方案:

  • 对于函数:将Shell函数转换为python函数
  • 对于shell局部变量(非导出),在调用python脚本之前,在shell中运行此命令:
    导出$(设置为| tr'\n'')

  • 对于shell全局变量(从shell导出),在python中,您可以: 导入操作系统 打印操作系统环境[“VAR1”]


  • 不,那是不可能的。您可以执行一个shell脚本,在命令行上传递参数,然后它可以输出数据,您可以从Python解析数据

    但这并不是真正调用函数。这仍然在使用选项执行bash,并在stdio上获得一个字符串


    那可能是你想要的。但这可能不是正确的方法。Bash无法完成Python无法完成的许多事情。改为用Python实现该函数。

    是的,与从另一个bash脚本调用该函数的方式类似:

    import subprocess
    subprocess.check_output(['bash', '-c', 'source unix_shell.sh && foo'])
    

    我对python不太了解,但是如果在shell脚本函数定义之后使用
    export-f foo
    ,那么如果启动一个子bash,就可以调用该函数。如果没有
    导出
    ,则需要以
    的形式运行shell脚本。script.sh
    在用python启动的子bash中,但它将运行其中的所有内容,并定义所有函数和所有变量。

    您可以将每个函数分离到它们自己的bash文件中。然后使用Python将正确的参数传递给每个单独的bash文件

    这可能比自己用Python重新编写bash函数更容易

    然后可以使用

    import subprocess
    subprocess.call(['bash', 'function1.sh'])
    subprocess.call(['bash', 'function2.sh'])
    # etc. etc.
    

    您也可以使用子流程传递参数。

    这可以通过子流程完成。(至少这是我在搜索时想要做的)

    像这样:

    output = subprocess.check_output(['bash', '-c', 'source utility_functions.sh; get_new_value 5'])
    
    其中utility_functions.sh如下所示:

    #!/bin/bash
    function get_new_value
    {
        let "new_value=$1 * $1"
        echo $new_value
    }
    
    下面是它在运行中的样子

    >>> import subprocess
    >>> output = subprocess.check_output(['bash', '-c', 'source utility_functions.sh; get_new_value 5'])
    >>> print(output)
    b'25\n'
    
    在和的帮助下,我得出以下结论:

    导入子流程
    command='bash-c“source~/.fileContainingTheFunction&&theFunction”'
    stdout=subprocess.getoutput(命令)
    打印(标准输出)
    

    我正在Ubuntu 18.04 LTS中使用Python 3.6.5。

    看看
    子流程模块。这可能会有所帮助。这并不是真正调用函数。它执行bash。@LennartRegebro:我不明白在不执行某种级别的bash的情况下,如何执行bash函数……这是可能的,而且它可以工作(经过测试):