python - 将 Xvfb 和 CutyCapt 作为 Python 子进程运行

标签 python subprocess xvfb cutycapt

我正在尝试使用 CutyCapt 在后台截取屏幕截图

我的应用程序是用 python 编写的,并通过运行子进程调用 CutyCapt。

在本地 (windows) 工作得很好,但是用于 windows 的 CutyCapt.exe 不需要 x 服务器。当我尝试在我的 ubuntu 机器上执行我的代码(通过 python 子进程)时,它咆哮着说我没有向 Xvfb 提供命令。但是,如果我自己在盒子上运行命令,它就可以正常工作。

适用于 box 的命令:

box$ xvfb-run --server-args="-screen 0, 1100x800x24" ./CutyCapt --url=http://www.google.com --out=temp.png

失败的 Python 代码:

def url_screengrab(url, **kwargs):
    url, temp_path, filename, url_hash = get_temp_screengrab_info(url)
    args = []
    if sys.platform.startswith("linux"):
        args.append('xvfb-run')
        args.append('--server-args="-screen 0, 1100x800x24"')
    args.append(settings.CUTYCAPT_EXE_PATH)
    args.append('--url=%s' % (url))
    args.append('--out=%s' % (temp_path,))
    subprocess.Popen(args, shell=False)
    return temp_path, filename, url_hash

返回错误:

xvfb-run: usage error: need a command to run
box$

我尝试过的事情: - 使用调用而不是 Popen -从屏幕参数中剥离引号 -将屏幕参数分解为列表 - 在执行子进程之前设置 os.environ["DISPLAY"]=":0"

我是否需要从 CutyCapt 命令中断 xvfb 进程?

如有任何帮助,我们将不胜感激。

最佳答案

在 Ubuntu 11.10 上,安装了 cutycapt 和 xvfb 软件包后,可以执行以下操作(至少对我而言...):

import shlex
import subprocess

def url_screengrab(url, **kwargs):
    cmd = '''xvfb-run --server-args "-screen 0, 1100x800x24"
             /usr/bin/cutycapt --url={u} --out=temp.png '''.format(u = url)
    proc = subprocess.Popen(shlex.split(cmd))
    proc.communicate()

url = 'http://www.google.com'
url_screengrab(url)

关于python - 将 Xvfb 和 CutyCapt 作为 Python 子进程运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10158864/

相关文章:

python - Django:与 TCP 服务器通信(扭曲?)

Python 在删除重复的 python 安装后要求 mac 上的旧路径

python - 杀死Python脚本中没有响应的exe文件

python - easyprocess.EasyProcessCheckInstalledError : cmd= ['Xvfb' , '-help' ] OSError=[Errno 2] 没有这样的文件或目录

ffmpeg - x11grab设备录屏时出现黑屏

ubuntu - Xvfb + ffmpeg/aconv 不工作

python objectlist 添加到所有对象

python - 使用 Python 解析 ping 输出

python - 从 Python 子进程调用 Perl 脚本中的 GetOptions

python - 当多个参数包含空格时如何使用子进程?