2011-12-21 76 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

您提供的环境变量到你的应用程序是高达你的方式。