【问题标题】:Python - call perl as subprocess - wait for finish its background process and print to shellPython - 调用 perl 作为子进程 - 等待完成其后台进程并打印到 shell
【发布时间】:2021-11-29 15:45:25
【问题描述】:

我有一个 Perl 脚本,内部调用 system("something &")。如果我从 shell 运行它,我会调用脚本,然后使用wait 命令等待所有后台进程。

如何从 Python 调用此脚本并等待它生成的“后台”脚本完成?

我试过了

pipe = subprocess.Popen(["perl", "script.pl", "data1", "data2"], stdin=subprocess.PIPE)
pipe.communicate()

但它不会等待并在 perl 脚本完成后退出。

另一个问题是我不知道如何在运行时将后台进程的输出打印到 shell。

【问题讨论】:

  • 你做 shell 做的事——在它自己的进程组中运行 perl 脚本,然后等待整个进程组(通过传递否定的 pgid 等待或它的 python 等效项)。我不太了解python,但this 似乎是一个开始。但请注意,如果 python 本身是从 bash 运行的,则 perl 脚本及其子脚本将在尝试访问终端时停止或出现错误。很多事情可能无法按预期工作。
  • 这就是为什么shell本身在运行脚本时默认不这样做的原因。请注意,直接来自终端的perl -e "system q{sleep 60 &}"; wait 将等待sleep,但sh -c 'perl -e "system q{sleep 60 &}"; wait'不会

标签: python perl subprocess


【解决方案1】:

我已经根据这个答案 How can I make Perl wait for child processes started in the background with system()? 更改 Perl 脚本来解决这个问题

我变了

system("something &") 

my $pid = fork();
if ($pid == -1) {
   print("Failed to fork");
   die;
} elsif ($pid == 0) {
   exec "something ";
}

并添加

while (wait() != -1) {}

到脚本结束

【讨论】:

    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 2021-07-26
    相关资源
    最近更新 更多