gpt4 book ai didi

python - 如何杀死通过 Python 启动的 headless X 服务器?

转载 作者:太空宇宙 更新时间:2023-11-03 23:50:25 24 4
gpt4 key购买 nike

我想用 Python 获取网页的屏幕截图。为此,我使用 http://github.com/AdamN/python-webkit2png/ .

    newArgs = ["xvfb-run", "--server-args=-screen 0, 640x480x24", sys.argv[0]]
for i in range(1, len(sys.argv)):
if sys.argv[i] not in ["-x", "--xvfb"]:
newArgs.append(sys.argv[i])
logging.debug("Executing %s" % " ".join(newArgs))
os.execvp(newArgs[0], newArgs)

基本上使用正确的参数调用 xvfb-run。但是 man xvfb 说:

请注意,上述示例中使用的演示 X 客户端不会自行退出,因此必须在 xvfb-run 退出之前将其杀死。

所以这意味着这个脚本将 如果整个事情都在循环中,(以获得多个屏幕截图)除非 X 服务器被杀死。我怎样才能做到这一点?

最佳答案

os.execvp 的文档状态:

These functions all execute a new program, replacing the current process; they do not return. [..]

所以在调用os.execvp之后,程序中的其他语句将不会被执行。您可能想使用 subprocess.Popen相反:

The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace several other, older modules and functions, such as:

使用subprocess.Popen,在虚拟帧缓冲区X服务器中运行xlogo的代码变为:

import subprocess
xvfb_args = ['xvfb-run', '--server-args=-screen 0, 640x480x24', 'xlogo']
process = subprocess.Popen(xvfb_args)

现在的问题是 xvfb-run 在后台进程中启动 Xvfb。调用 process.kill() 不会杀死 Xvfb(至少在我的机器上不会……)。我一直在摆弄这个,到目前为止,唯一对我有用的是:

import os
import signal
import subprocess

SERVER_NUM = 99 # 99 is the default used by xvfb-run; you can leave this out.

xvfb_args = ['xvfb-run', '--server-num=%d' % SERVER_NUM,
'--server-args=-screen 0, 640x480x24', 'xlogo']
subprocess.Popen(xvfb_args)

# ... do whatever you want to do here...

pid = int(open('/tmp/.X%s-lock' % SERVER_NUM).read().strip())
os.kill(pid, signal.SIGINT)

因此这段代码从/tmp/.X99-lock 中读取Xvfb 的进程ID,并向该进程发送一个中断。它有效,但确实会时不时地产生一条错误消息(不过我想你可以忽略它)。希望其他人可以提供更优雅的解决方案。干杯。

关于python - 如何杀死通过 Python 启动的 headless X 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1747022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com