【问题标题】:Calling a python function from a subshell从子shell调用python函数
【发布时间】:2021-09-21 08:35:05
【问题描述】:

我正在编写一个 python 程序,它在子进程中运行一些 BASH 脚本。 有人可能会说我使用 BASH 作为我的 python 程序的脚本语言。

有没有办法将 python 函数注入到我的 bash 脚本中,而无需从 bash 重新加载 python 代码?

strawman 示例:如果这是运行 Javascript 的 Python,那么我可以将我的 Python 函数绑定到 js2py VM 并从 javascript 中调用它们。

我想从 bash 调用:python some_file_of_mine.py,但这将启动一个新的 python 进程,而无法访问我的 python 程序的数据。

还想打电话给:python -c $SOME_INJECTED_PYTHON_CODE。这可以使用 Python 的 inspect.source() 将一些简单的 Python 代码以及一些来自父进程的绑定数据预注入到子 bash shell 中。但是,这将非常有引号(`/") 的意义,并且会导致 $import 出现一些问题。

我真正想要的是一种将父进程调用为 bash 子进程并取回一些数据的简单方法(不使用 Flask + CURL 组合)

【问题讨论】:

  • 我不明白你的问题。也许您应该在一个 Python 脚本中运行所有内容并跳过所有 bash 代码。或者,也许您应该将数据写入文件并在其他脚本中读取。或作为参数发送python script.py arg1 arg2 ...
  • 您可以使用 fifo 文件进行通信,或者让 Python 进程创建一对 fds 来读取/写入。但是为什么不使用 Python 编写 Python 脚本呢?
  • @AKX 文件描述符听起来是个好主意。我会试试的
  • 这似乎是XY Problem 的一个例子。

标签: python bash shell scripting


【解决方案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)。

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

【讨论】:

    猜你喜欢
    • 2012-01-23
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2018-09-14
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多