Python PyQt4:调用计时器中的命令.getoutput()时中断了系统调用
这个问题看起来很简单,但在谷歌搜索了一天并查看stackoverflow之后,我找不到任何解决方案。 最初,我正在开发一个简单的plasmoid,它将每30分钟向本地web服务器发送一个特定请求,解析输出并显示在面板上的标签中。我举了一个等离子体的例子,并对它进行了修改。代码如下:Python PyQt4:调用计时器中的命令.getoutput()时中断了系统调用,python,pyqt,pyqt4,pipe,Python,Pyqt,Pyqt4,Pipe,这个问题看起来很简单,但在谷歌搜索了一天并查看stackoverflow之后,我找不到任何解决方案。 最初,我正在开发一个简单的plasmoid,它将每30分钟向本地web服务器发送一个特定请求,解析输出并显示在面板上的标签中。我举了一个等离子体的例子,并对它进行了修改。代码如下: #!/usr/bin/env python # coding: utf-8 """ BWC Balance plasmoid Site: http://bitbucket.org/svartalf/bwc-bal
#!/usr/bin/env python
# coding: utf-8
"""
BWC Balance plasmoid
Site: http://bitbucket.org/svartalf/bwc-balance-plasmoid/
Author: SvartalF (http://svartalf.info)
Original idea: m0nochr0me (http://m0nochr0me.blogspot.com)
"""
import re
from urllib import urlencode
import urllib2
import cookielib
import datetime
import sys
import re
import string
import os
import gobject
import commands
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyKDE4.kio import *
from PyKDE4.kdeui import *
from PyKDE4.kdecore import *
from PyKDE4.plasma import Plasma
from PyKDE4 import plasmascript
from PyKDE4.solid import Solid
from settings import SettingsDialog
parsed_ok = 0
curr_day = ''
class BWCBalancePlasmoid(plasmascript.Applet):
"""Applet main class"""
def __init__(self, parent, args=None):
plasmascript.Applet.__init__(self, parent)
def init(self):
"""Applet settings"""
self.setHasConfigurationInterface(True)
self.setAspectRatioMode(Plasma.Square)
self.theme = Plasma.Svg(self)
# self.theme.setImagePath("widgets/background")
# self.setBackgroundHints(Plasma.Applet.DefaultBackground)
self.layout = QGraphicsLinearLayout(Qt.Horizontal, self.applet)
# Main label with balance value
self.label = Plasma.Label(self.applet)
self.label.setText(u'<b><font color=blue size=3>No data...</font></b>')
self.layout.addItem(self.label)
self.applet.setLayout(self.layout)
self.resize(350, 30)
self.startTimer(2500)
def postInit(self):
"""Start timer and do first data fetching
Fired only if user opened access to KWallet"""
self.setLabelText()
def update(self, value):
"""Update label text"""
self.label.setText(value)
def timerEvent(self, event):
"""Create thread by timer"""
self.setLabelText()
pass
def setLabelText(self):
login = 'mylogin'
request = 'curl --ntlm -sn http://some.local.resource'
out_exp = ""
out_exp = commands.getoutput(request)
table_name_exp = re.findall(r"some_regular_expression",out_exp)
tp = '| html2text | grep -i -A3 ' + login
out_exp = ''
try:
cmd_exp = 'curl --ntlm -sn ' + table_name_exp[0] + ' ' + tp
out_exp = commands.getoutput(cmd_exp)
except:
cmd_exp = ''
date_check = re.findall(r"one_more_regular_expression", out_exp)
times_exp = re.findall(r"[0-9][0-9]:[0-9][0-9]", out_exp )
if len(times_exp) != 0 and len(date_check) != 0:
self.label.setText(u'<b><font color=blue size=3>Start: ' + times_exp[0] + u' --- Finish: ' + str(int(string.split(times_exp[0], ':')[0]) + 9) + ':' + string.split(times_exp[0], ':')[1] + ' </span></b>')
else:
self.label.setText(u'<b><font color=blue size=3>No data...</span></b>')
def CreateApplet(parent):
return BWCBalancePlasmoid(parent)
我在谷歌上搜索了几个小时后才明白:从管道中读取的数据被某种信号中断了。但我唯一的信号是定时器。我发现的唯一建议是“消除干扰阅读的信号”。这对我来说似乎有点奇怪和不切实际:在没有定时器的情况下定期读取数据。
我错过什么了吗?也许应该使用其他机制来访问web资源并解析其输出?或者“系统调用中断”是正常情况,应该以某种方式处理
提前感谢您的帮助。管道仍在读数时,似乎正在发送信号 因此,请尝试在调用
setLabelText()
之前停止计时器,然后再次重新启动计时器
编辑
您还应该尝试重写代码,以使用子流程
,而不是不推荐使用的命令
模块。例如:
pipe = subprocess.Popen(['curl', '--ntlm', '-sn',
'http://some.local.resource'],
stdout=subprocess.PIPE)
output = pipe.communicate()[0]
当管道仍在读数时,似乎正在发送信号 因此,请尝试在调用
setLabelText()
之前停止计时器,然后再次重新启动计时器
编辑
您还应该尝试重写代码,以使用子流程
,而不是不推荐使用的命令
模块。例如:
pipe = subprocess.Popen(['curl', '--ntlm', '-sn',
'http://some.local.resource'],
stdout=subprocess.PIPE)
output = pipe.communicate()[0]
我试图在setLabelText()之前杀死timerEvent()中的计时器-结果相同:中断了系统调用。我现在什么都不懂。最初它是一个Gnome小程序,它工作得很好,没有产生任何错误,这种奇怪的中断…:-/有趣的是,读取一个大文件不会给脚本带来任何麻烦。“非常奇怪!”格雷克斯说。有没有可能从方程式中删除plasma,并用一个简单、纯粹的pyqt示例重现错误?我尝试创建一个小示例,发现当我用WWW中的任何站点(例如)替换我们的本地资源时,问题就消失了。看起来问题不在PyQt本身,而是它与curl和本地资源的结合。为子流程模块竖起大拇指!我已经用subprocess.Popen/pipe.communicate替换了commands.getoutput(),它工作得非常好!谢谢你的提示!我试图在setLabelText()之前杀死timerEvent()中的计时器-结果相同:中断了系统调用。我现在什么都不懂。最初它是一个Gnome小程序,它工作得很好,没有产生任何错误,这种奇怪的中断…:-/有趣的是,读取一个大文件不会给脚本带来任何麻烦。“非常奇怪!”格雷克斯说。有没有可能从方程式中删除plasma,并用一个简单、纯粹的pyqt示例重现错误?我尝试创建一个小示例,发现当我用WWW中的任何站点(例如)替换我们的本地资源时,问题就消失了。看起来问题不在PyQt本身,而是它与curl和本地资源的结合。为子流程模块竖起大拇指!我已经用subprocess.Popen/pipe.communicate替换了commands.getoutput(),它工作得非常好!谢谢你的提示!看起来像是命令。getoutput()有一个bug。我将其替换为os.system(),其中curl将输出保存在一个文件中,并简单地打开该文件。很好。感谢ekhumoro的帮助。看起来像是命令。getoutput()有一个bug。我将其替换为os.system(),其中curl将输出保存在一个文件中,并简单地打开该文件。很好。谢谢你对ekhumoro的帮助。