2012-04-15 91 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