4

我已经使用PyQt4.QtWebkit在我的 django 应用程序中抓取网页。在生产环境中,该模块无法抓取它。它抛出错误“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-shell 调用:

 r = Render(url)

当我使用 Django-shell(python manage.py shell)通过 django 调用这个“渲染”类时,渲染函数会抛出错误。你能帮我解决这个问题吗?

4

3 回答 3

8

原因是“Xvfb”

我同样需要在带有 xvfb(X virtual frame buffer) 的 bash shell 中运行我的 python 程序,

ubuntu@localhost$ xvfb-run python webpage_scrapper.py http://www.google.ca/search?q=navaspot

它给出了结果。

现在我的要求是我需要在 python 中执行这个 shell 命令并等待 tine 收集结果。我必须处理结果。

您能否建议我在 python 上有效地执行此命令。

于 2011-12-22T15:44:49.127 回答
1

似乎未设置 X 显示的环境变量,这就是您收到此类错误的原因。发生这种情况是因为您从环境中运行脚本,该脚本未绑定到 X 显示器(ssh 到服务器)。

尝试添加显示变量:

DISPLAY=:0.0 python manage.py script

也可以从 python 设置 DISPLAY 环境变量。您可以在调用 PyQt4 之前设置它:

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

如果您的生产环境没有运行 X 服务器,也可能无法运行 PyQt4.QtWebkit。

于 2011-12-21T23:05:12.913 回答
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

向应用程序提供环境变量的方式取决于您。

于 2015-12-26T20:22:38.027 回答