6

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

脚本是 unix_shell.sh

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

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

解决方案:

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

  3. 对于shell全局变量(从shell导出),在python中可以:import os print os.environ["VAR1"]

4

6 回答 6

4

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

import subprocess
subprocess.check_output(['bash', '-c', 'source unix_shell.sh && foo'])
于 2013-04-16T21:06:21.557 回答
3

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

像这样:

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'
于 2019-09-11T15:34:53.703 回答
1

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

但这并不是真正调用该函数。那仍然使用选项执行 bash 并在 stdio 上获取字符串。

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

于 2013-04-16T20:50:55.033 回答
1

上述答案这个答案的帮助下,我想出了这个:

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

我在 Ubuntu 18.04 LTS 中使用 Python 3.6.5。

于 2019-09-21T04:17:53.147 回答
0

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

于 2013-04-16T21:34:47.897 回答
0

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

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

然后,您可以使用调用这些函数

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

您也可以使用 subprocess 来传递参数。

于 2015-08-26T16:25:37.780 回答