我已经使用 PyQt4.QtWebkit 来抓取我的django应用程序中的网页。在生产环境中该模块无法抓取它。它会抛出错误“manage.py:can not not连接到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调用这个“Render”类时,render函数会抛出错误。 你能帮帮我吗?
答案 0 :(得分:7)
原因是"Xvfb"
我需要使用xvfb(X虚拟帧缓冲区)在bash shell中运行我的python程序 同样地,
ubuntu@localhost$ xvfb-run python webpage_scrapper.py http://www.google.ca/search?q=navaspot
它给出了结果。
现在我的要求是我需要在python中执行这个shell命令并等待tine来收集结果。我必须处理结果。
请你建议我有效地在python上执行这个命令。
答案 1 :(得分:1)
似乎没有设置X显示的环境变量,这就是你得到这样的错误的原因。之所以会发生这种情况,是因为您正在从环境运行脚本,而不是绑定到X显示(ssh到服务器)。
尝试添加显示变量:
DISPLAY=:0.0 python manage.py script
也可以从python设置DISPLAY环境变量。您可以在调用PyQt4之前设置它:
import os
os.putenv('DISPLAY', ':0.0')
如果您的生产环境没有运行X服务器,也可能无法运行PyQt4.QtWebkit。
答案 2 :(得分: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
您向应用程序提供环境变量的方式取决于您。