【问题标题】:Call a function defined in a shell script from a subprocess从子进程调用在 shell 脚本中定义的函数
【发布时间】:2018-03-23 06:50:24
【问题描述】:

我有一个 Python 脚本 (Python 3.6),旨在从 shell 脚本中调用。这个 shell 脚本在调用 Python 脚本之前定义了一些函数。在 Python 代码中,我想在子进程中使用这些函数。

这是我正在尝试做的一个示例

# Shell script
function func1() {
    echo "func1 completed"
}
python /path/to/my_script.py

Python 脚本

# my_script.py
import subprocess
p = subprocess.Popen("func1",
                     stdout = subprocess.PIPE,
                     shell = True)

但是,在运行它时,我收到错误:/bin/sh: func1: command not found

我已经尝试使用shell = False,通过env = os.environ,并使用os.system,但我得到了类似的错误。有没有办法做到这一点?

【问题讨论】:

  • 为每个函数创建一个单独的脚本并用Popen调用这些解耦的脚本不是更容易吗?

标签: python python-3.x shell


【解决方案1】:

您应该使用source 或仅使用. 读取文件,然后调用函数。 Source 将加载 bash 脚本定义的函数。 正确的方法是source my_scripts.sh && func1

编辑: 我带来了这个解决方案。

bash
#!/bin/bash
function func1() {
    echo "func1 completed"
}
function invoke_python(){
    python a.py
}
if [ -z "$@" ]; then
    invoke_python 
else
    "$@"
fi

对于python,我明白了。

import subprocess
p = subprocess.Popen("./a.sh func1",
        stdout = subprocess.PIPE,
        shell = True)
p.wait()

【讨论】:

  • 那里有一个圆圈。你是先执行你的 script.sh 还是你的 python 脚本?看看this thread
  • 我相信你指出的那个帖子是这个问题的最佳答案:)!
  • 这似乎不起作用,因为 shell 脚本调用了 Python 脚本,所以当我从第二个脚本中获取第一个时,看起来它们进入了无限循环。
  • 是的,我目前正在努力解决 :),它比我想象的要复杂。
  • 已编辑:)。它基于@MarcoMilanesio 提到的线程的解决方案
猜你喜欢
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多