【问题标题】:Python Popen() is blockingPython Popen() 阻塞
【发布时间】:2021-07-15 22:25:22
【问题描述】:

我想写一个小python脚本来自动创建 Jekyll 博客,但是popen() 似乎会阻塞而不是异步调用。

预期的行为是:

  1. 异步启动jekyll serve --livereload
  2. 启动firefox-esr http://127.0.0.1:4000 async 并等待它(或同步,这与我的用例无关)
  3. firefox 终止后,也终止 Jekyll。
jekyll = subprocess.Popen(['jekyll', 'serve', '--livereload'])
print('This never gets displayed')
time.sleep(3)
firefox = subprocess.Popen(['firefox-esr', 'http://127.0.0.1:4000'])
firefox.wait()
jekyll.terminate()

但这只会启动 Jekyll 并将其标准输出输出到终端。

这个问题只出现在 Jekyll 中。 ping 或我尝试过的任何其他命令/程序都可以正常工作。

关于我做错了什么有什么想法吗?

【问题讨论】:

  • 终端是否显示错误?
  • 没有。它显示了 jekyll 标准输出。通过 ctrl+c 杀死 python 脚本时,如果有帮助,jekyll 进程不会终止。我很困惑,因为我用另一个软件做了一个完全相似的事情,它就像一个魅力。
  • 你可以尝试任何其他命令而不是Jekyll,它不会在终端中不断输出一些东西,并检查终端是否有输出/错误。你确定你有firefox-esr
  • 当反转命令时,firefox 启动,然后 jekyll 开始阻塞。使用ping 等其他命令我没有问题。您知道修补程序吗?也许编写一个只调用 jekyll 的 bash 脚本,我可以异步调用然后终止。这显然是 Jekyll 的问题。
  • 我不知道有修补程序,但 bash 脚本可以提供帮助,甚至线程也可以提供帮助,但不确定。我会尝试在我的本地机器上做。

标签: python python-3.x asynchronous jekyll popen


【解决方案1】:

如果你在 Linux 上,你可以为它创建一个简单的bash 脚本。

#!/bin/bash

jekyll serve --livereload & 
sleep 5
firefox-esr http://127.0.0.1:4000 &>/dev/null


pid=$(pgrep firefox-esr)

while :
do
    sleep 5
    if [ -z  "$pid" ]
    then
        pkill ruby 2>/dev/null
        echo "Killed jekyll"
        break
    fi
done

授予此文件执行权限

chmod +x filename.sh

然后运行这个bash 脚本

./filename.sh &

这将使您的脚本在后台运行。

【讨论】:

  • 非常感谢!但不幸的是,这不起作用:它可以很好地启动 Jekyll 和 firefox(但地址中有一点错字),但由于某种原因它也无法杀死 jekyll。
  • 我查看了 htop 并修改了您的答案。 htop 说命令是 ruby​​2.5 。杀死红宝石对我有用,但可以说是残酷的。我可以忍受后果,因为我只将 ruby​​ 用于 Jekyll,但其他人可能不会。非常感谢,我正在考虑为我接受这个答案。
猜你喜欢
  • 2019-05-08
  • 2011-08-02
  • 2012-05-23
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多