【问题标题】:How to start a background shell or kernel (e.g. python), connect to it, and retrieve output如何启动后台 shell 或内核(例如 python)、连接到它并检索输出
【发布时间】:2018-02-24 20:06:39
【问题描述】:

这似乎很明显,但经过大量搜索后,无法找到正确的搜索词来获得答案。搜索“连接到 python 内核”之类的内容只会找到关于 Jupyter 和 IPython 的页面和页面。

重击

我找到了this,它使用协进程的方法很接近。

我的理想是:

create_named_process proc1
create_named_process proc2

然后以某种方式向 proc1 发送命令并获取输出,然后向 proc2 发送命令并获取输出。然后用更多的命令再做一遍。

Python

我确实找到了 Python subprocess 和 bash 子shell。但不知道如何让那些在后台继续运行并连接到他们。例如,我可以这样做

process = subprocess.Popen(['your_background_command'])
stdoutdata, stderrdata = process.communicate()

但我认为如果我杀死启动子进程的进程,那么子进程就会死掉。 (一位评论者说使用Shell=True 将导致进程保持活动状态,但不确定我将如何访问它。他们删除了评论)。

另外,如何向进程传递更多命令?文档中没有类似的内容。

注意此帖子包含编辑内容。

【问题讨论】:

  • 驾车投票者。如果您不喜欢它,请说出原因。如果你认为这是一个愚蠢的问题,也许它是。也许我很愚蠢。但我仍然想知道如何做问题中的“事情”。

标签: python bash kernel subprocess coproc


【解决方案1】:

我在搜索中不了解您的内核,但您似乎缺少一些有关 bash stdio/stderr 处理的基础知识。

一个进程(通常)有 3 个标准 io 流:

  • stdin(标准输入)
  • stdout(标准输出)
  • stderr(标准错误)

您可以使用管道 (|) 或文件(使用 <,>,<< 或 >>)重定向所有这些 IO 流。例如:

ls -l | grep "r-x" | sed 's/^.*:...//' > 5_files.list

您可以使用 fifo 代替普通文件:

mkfifo fifootje
tail -f fifootje | grep --line-buffered "r-x"  
ls -l > fifootje

或者,根据你的指挥理念:

#!/bin/bash
mkfifo fifootje
while read line ; do
    case "$line" in
    (a) ls /tmp ;;
    (b) ls /var ;;
    (*) echo 'only a or b please' ;;
    esac
done

然后将a 或b(每行一个)回显到fifo。

这有帮助吗?

【讨论】:

  • 我希望能够启动实际上并不存在于命令窗口中的 shell 并与它们交互。就像启动一个持久的虚拟 bash shell,向标准输入发送一些东西,捕获标准输出和标准错误,向标准输入发送另一个命令等等。但我希望能够以编程方式完成它,而不是使用屏幕会话或其他东西。跨度>
  • 那么你有没有尝试过 fifo?比如mkfifo a; tail -f a | bash & 然后echo ls >> a?这不是你要问的(第一部分)吗?
  • 嘿,这似乎真的有效。这些是否在单独的过程中执行?另外,即使我关闭了创建它的外壳,我也可以重新连接到该 fifo 吗?我需要学习fifo。
  • 也许我还可以更好地描述一下,我正在尝试制作类似 Jupyter 笔记本的东西,它可以在 Python 内核中的单元、R 内核中的另一个单元和 bash 中的另一个单元上执行壳。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 2019-03-16
  • 2016-07-08
  • 1970-01-01
  • 2013-05-25
相关资源
最近更新 更多