2012-04-15 90 views
3

我是一个试图采取截图使用CutyCapt运行的Xvfb和CutyCapt像Python子

我的应用程序是用Python编写,并通过运行一个子进程调用CutyCapt背景。

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

命令上盒的工作原理:

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 - 从屏幕参数报价 - 在执行子进程之前将屏幕列入列表 -setting os.environ [“DISPLAY”] =“:0”

我需要从CutyCapt命令中断开xvfb进程吗?

任何帮助将不胜感激。

+0

如果你正在使用'壳= TRUE',则第一个参数“Popen”应该是一个字符串,而不是一个列表。当'shell = False'(默认)时,第一个参数应该是一个列表。你用'shell = False'试过了吗? – unutbu 2012-04-15 01:46:29

+0

如果'settings.PLATFORM'不是''linux'','xvfb-run'如何被附加到'args'? – unutbu 2012-04-15 01:47:01

+0

而不是手动构建参数,请尝试'导入shlex; args = shlex.split('''xvfb-run --server-args =“ - screen 0,1100x800x24”./CutyCapt --url = http://www.google.com --out = temp.png'' “)'。 – unutbu 2012-04-15 01:48:37

回答

5

在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) 
+0

,它工作,thx。有什么我必须做的,以确保关闭子进程,因为它似乎我的下一行代码不能访问'temp.png'文件,即使它创建它正确? – MattoTodd 2012-04-15 16:44:03

+0

'proc.communicate()'将阻塞,直到子进程完成。 – unutbu 2012-04-15 16:49:53

+0

你是男人!非常感谢 – MattoTodd 2012-04-15 16:59:37