【问题标题】:How to call a shell script function/variable from python?如何从 python 调用 shell 脚本函数/变量?
【发布时间】:2013-04-16 20:49:01
【问题描述】:

有什么方法可以调用shell脚本并使用python脚本中定义的函数/变量?

脚本是 unix_shell.sh

#!/bin/bash
function foo
{
...
}

是否可以从python调用这个函数foo?

解决办法:

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

  3. 对于shell全局变量(从shell导出),在python中,你可以: 导入操作系统 打印 os.environ["VAR1"]

【问题讨论】:

  • 看看subprocess 模块。它可能会有所帮助。

标签: python bash


【解决方案1】:

是的,与从另一个 bash 脚本中调用它的方式类似:

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

【讨论】:

  • 这并不是真正调用函数。执行 bash。
  • @LennartRegebro:我不明白你怎么能期望在不执行 bash 的情况下执行 bash 函数......
【解决方案2】:

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

像这样:

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'

【讨论】:

    【解决方案3】:

    不,这是不可能的。你可以执行一个shell脚本,在命令行传递参数,它可以打印出数据,你可以从Python中解析出来。

    但这并不是真正的调用函数。那仍在执行带有选项的 bash 并在 stdio 上返回一个字符串。

    这可能会做你想要的。但这可能不是正确的方法。 Bash 不能做很多 Python 做不到的事情。改为在 Python 中实现该函数。

    【讨论】:

    【解决方案4】:

    在above answer 和this answer 的帮助下,我想出了这个:

    import subprocess
    command = 'bash -c "source ~/.fileContainingTheFunction && theFunction"'
    stdout = subprocess.getoutput(command)
    print(stdout)
    

    我在 Ubuntu 18.04 LTS 中使用 Python 3.6.5。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        这可能比自己在 Python 中重写 bash 函数更容易。

        然后您可以使用

        调用这些函数
        import subprocess
        subprocess.call(['bash', 'function1.sh'])
        subprocess.call(['bash', 'function2.sh'])
        # etc. etc.
        

        你也可以使用子进程来传递参数。

        【讨论】:

          猜你喜欢
          • 2012-01-23
          • 2020-10-02
          • 2011-09-30
          • 2016-03-13
          • 2012-03-08
          • 1970-01-01
          • 2017-10-12
          • 2019-12-29
          • 2019-01-19
          相关资源
          最近更新 更多