2011-12-21 126 views
2

我已經使用PyQt4.QtWebkit來抓取我的Django應用程序中的網頁。在生產環境中,模塊無法抓取它,它會拋出錯誤「管理的.py:無法連接到X服務器」manage.py:無法連接到X服務器

我的Qt類:

class Render(QWebPage): 
def __init__(self, url): 
    self.app = QApplication(sys.argv) 
    QWebPage.__init__(self) 
    self.loadFinished.connect(self._loadFinished) 
    self.mainFrame().load(QUrl(url)) 
    self.app.exec_() 

def _loadFinished(self, result): 
    self.frame = self.mainFrame() 
    self.app.quit() 

從Django的外殼呼籲:

r = Render(url) 

當我把這稱爲 「渲染」 C lass通過django與Django shell(python manage.py shell)渲染函數拋出錯誤。 你能幫我解決嗎?

+0

什麼是錯誤?對我來說工作 – Goin 2011-12-21 20:20:34

+0

「manage.py:無法連接到X服務器」 – Nava 2011-12-22 09:14:52

回答

7

原因是"Xvfb"

我需要在bash殼與xvfb的運行我Python程序(X虛擬幀緩衝器) 同樣,

[email protected]$ xvfb-run python webpage_scrapper.py http://www.google.ca/search?q=navaspot 

它給出結果。

現在我的要求是我需要在python中執行這個shell命令,並等待tine收集結果。我必須處理結果。

你能否建議我在python上有效地執行這個命令。

+0

This works.Remember remove the「os.putenv('DISPLAY',':0.0')」from Marius'答案雖然! – 2012-09-21 08:55:12

+0

這確實有用,謝謝! – Jim 2014-04-30 15:21:44

1

看起來像X顯示的環境變量沒有設置,這就是你得到這樣的錯誤的原因。它可能發生是因爲您正在從環境運行腳本,而不是綁定到X顯示器(ssh到服務器)。

嘗試增加顯示變量:

DISPLAY=:0.0 python manage.py script 

另外,也可以從設置蟒DISPLAY環境變量。您可以致電PyQt4的前設置:

import os 
os.putenv('DISPLAY', ':0.0') 

它也可能無法運行PyQt4.QtWebkit如果您的生產環境沒有X服務器上運行。

+0

仍然我越來越「manage.py:無法連接到X服務器:0.0」此錯誤爲這個Django命令「DISPLAY =:0.0 python manage.py shell - -settings = PROD_settings「? – Nava 2011-12-22 10:12:08

+0

即使我在上面兩種方式嘗試仍然更改錯誤是「manage.py:無法連接到X服務器:0.0」,但它在我的本地計算機上工作。 – Nava 2011-12-22 10:23:55

0

通常在無頭機器上,DISPLAY變量不存在或配置錯誤。要在這些機器上工作,可以使用以下方法。至於Ubuntu 14.04-LTS機一個例子:

首先安裝X服務器: sudo apt-get install xserver-xorg

現在啓動X服務器(在:0說): sudo /usr/bin/X :0&

您可以使用流程管理器像supervisor處理上述處理。

現在只需設置DISPLAY環境變量,並確保它是提供給您正在運行依賴此的任何進程, DISPLAY=:0 python manage.py

您提供的環境變量到你的應用程序是高達你的方式。