agi*_*liq 2 python screenshot xserver
我想用 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)
Run Code Online (Sandbox Code Playgroud)
基本上使用正确的参数调用 xvfb-run 。但man xvfb说:
Note that the demo X clients used in the above examples will not exit on their own, so they will have to be killed before xvfb-run will exit.
因此,这意味着如果整个事情处于循环状态,该脚本将<????>(为了获取多个屏幕截图),除非 X 服务器被终止。我怎样才能做到这一点?
状态的文档os.execvp :
这些函数都执行一个新的程序,替换当前的进程;他们没有回来。[..]
所以调用后os.execvp程序中不会执行任何其他语句。您可能想改用subprocess.Popen:
该
subprocess模块允许您生成新进程,连接到它们的输入/输出/错误管道,并获取它们的返回代码。该模块旨在替换其他几个较旧的模块和功能,例如:
使用,在虚拟帧缓冲区 X 服务器中subprocess.Popen运行的代码变为:xlogo
import subprocess
xvfb_args = ['xvfb-run', '--server-args=-screen 0, 640x480x24', 'xlogo']
process = subprocess.Popen(xvfb_args)
Run Code Online (Sandbox Code Playgroud)
现在的问题是在后台进程中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)
Run Code Online (Sandbox Code Playgroud)
Xvfb所以这段代码读取from的进程ID/tmp/.X99-lock并向该进程发送一个中断。它可以工作,但确实会时不时地产生一条错误消息(不过我想你可以忽略它)。希望其他人可以提供更优雅的解决方案。干杯。
| 归档时间: |
|
| 查看次数: |
4276 次 |
| 最近记录: |