【问题标题】:Calling a Python function from a shell script从 shell 脚本调用 Python 函数
【发布时间】:2012-01-23 22:46:30
【问题描述】:

我正在尝试弄清楚如何从 shell 脚本调用 Python 函数。

我有一个包含多个函数的 Python 文件,我需要在我的 shell 脚本中使用它们返回的值。有什么办法吗。

我这样做是为了使用 Python 读取配置文件并在 shell 中获取值。有没有其他更好的方法来实现这一点。

test.py 包含:

import ConfigParser

config = ConfigParser.ConfigParser()
config.read("test.conf")

def get_foo():
    return config.get("locations", "foo")

def get_bar():
    return config.get("locations", "bar")

我需要将 Python 函数返回的值存储在一个 shell 变量中。

【问题讨论】:

  • 您要解决的更大的问题是什么?为什么不使用带有配置的脚本来完成 shell 脚本的工作?或者,为什么不从 shell 读取配置?我认为问题足够复杂,可以将其分成两个文件。
  • 如果 test.py 路径是 '/root/src/test.py' 怎么办?

标签: python bash shell configuration-files


【解决方案1】:

您可以通过要求 Python 解释器打印结果来将函数的结果发送到标准输出:

python -c 'import test; print test.get_foo()'

-c 选项只是要求 Python 执行一些 Python 命令。

为了将结果存储在变量中,您可以这样做:

RESULT_FOO=`python -c 'import test; print test.get_foo()'`

或者,等价

RESULT=$(python -c 'import test; print test.get_foo()')

因为反引号和$(…) 评估一个命令并用它的输出替换它。

PS:每次获取每个函数的结果都需要解析配置文件,采用这种方式。这可以通过一次性返回所有结果来优化,例如:

ALL_RESULTS=$(python -c 'import test; print test.get_foo(), test.get_bar()')

然后可以将结果拆分并放入不同的变量中

RESULT_BAR=$(echo $ALL_RESULTS | cut -d' ' -f2)

它获取 second 结果并将其放入 RESULT_BAR 中(类似地:-fn 表示结果 #n)。

PPS:正如 Pablo Maurin 所提到的,如果可能的话,在一个解释器(Python,但也可能是 shell)中完成所有事情可能会更容易,而不是在一个程序中计算变量并在另一个中使用它们。

【讨论】:

  • 或尝试将输出发送到其他 python 脚本并运行。
  • 看起来不错..确实有效..我想知道。在这种情况下.. 要从配置文件中读取 n 参数,我需要从 shell 调用上述行 n 次,最终将使用 configparser 在 python 中读取这么多次。还有其他更好的方法吗?
  • @saddy:例如,您可以将两个结果一起打印,然后使用 Unix 实用程序将它们拆分:RESULT=$(import test; print test.get_foo(), test.get_bar()),然后使用 cutsed (?) 或 @987654333 @(?) 依次提取结果的每一部分:RESULT2=$(echo $RESULT | cut -d' ' -f 2) 给出你的get_bar() 等。
  • @EOL 是的,这就是我想要的……谢谢。
  • 如果模块是python3,则需要使用打印功能。例如。 python3 -c 'import test; print(test.get_foo())'
猜你喜欢
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多