Python Popen() 被阻塞

问题描述

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

预期的行为是:

  1. 异步启动 jekyll serve --livereload
  2. 启动 firefox-esr http://127.0.0.1:4000 异步并等待它(或同步,这与我的用例无关)
  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 或我尝试过的任何其他命令/程序都可以正常工作。

对我做错了什么有什么想法吗?

解决方法

如果您使用的是 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 &

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