【问题标题】:How to print to terminal window from subprocessed python script如何从子处理的python脚本打印到终端窗口
【发布时间】:2021-02-07 05:04:01
【问题描述】:

我创建了一个运行 python 脚本的子进程,如下所示:

p = subprocess.Popen(['nohup', 'python', 'listen.py'],
                     cwd="/execute",
                     stdout=subprocess.PIPE,
                     stderr=subprocess.STDOUT)

然后我让生成线程终止;并且产生的子进程保持运行。用户(我)回到了 bash 终端。

我希望从子进程(来自listen.py)中打印到这个终端 - 我怎样才能做到这一点?

【问题讨论】:

标签: python bash subprocess


【解决方案1】:

所以脚本 A 生成脚本 B 并终止,然后你想访问脚本 B 的标准输出?

第一件事是您可能不想从 A 中的脚本 B 捕获标准输出。但是标准输出必须去某个地方,例如文件(解决方案 2),或者它可以只是从父进程(解决方案 1)。

解决方案 1

以下内容将立即退出到 shell,然后在 3 秒后将“123”写入同一终端。如果您将脚本 A 通过管道传输到文件,那么脚本 B 的输出也会到那里。

python -c "import subprocess; subprocess.Popen(['python', '-c', 'import time; time.sleep(3); print(123)'])"

解决方案 2

如果您希望脚本 A 输出到终端,但要将脚本 B 的输出存储在其他地方,那么您可以直接将其写入文件,例如通过将文件作为标准输出 kwarg 提供给 Popen,如下所示:

p = subprocess.Popen(['python', 'listen.py'],
                     cwd="/execute",
                     stdout=open('/execute/results.txt', 'w'),
                     stderr=subprocess.STDOUT)

解决方案 3

或者,如果您特别想使用 nohup,那么以下通常默认情况下会将子进程的输出写入 nohup.txt

p = subprocess.Popen(['nohup', 'python', 'listen.py'],
                     cwd="/execute",
                     stderr=subprocess.STDOUT)

【讨论】:

  • 解决方案 2 看起来很有希望。
【解决方案2】:

使用nohup,您根本做不到。 nohup 的特点之一是它可以将启动的进程与任何终端分离。

没有nohup,在简单的情况下,根本不要使用stdinstdoutstderr关键字参数到Popen();子进程将从调用进程继承这些文件描述符的副本。

但是,在您使用终端时让后台进程写入终端可能会造成极大的破坏;更好的解决方案通常是让进程写入日志文件,如果您愿意,可以在不同的终端或其他程序中写入日志文件,如果您愿意,可以tail -f

【讨论】:

  • 产卵过程在没有 nohup 的情况下终止后是否可以继续进行?
  • 嗯?使用Popen,父子进程并行运行。
  • 或者你的意思是父进程退出后子进程是否继续运行?是的,确实如此(因为您可以轻松地验证自己)。
猜你喜欢
  • 2014-11-02
  • 2021-08-15
  • 2022-12-11
  • 2015-11-04
  • 2021-11-14
  • 1970-01-01
  • 2017-12-29
  • 2014-05-27
  • 1970-01-01
相关资源
最近更新 更多