Python控制台输出与Spyder控制台不同

3 投票
1 回答
1272 浏览
提问于 2025-04-16 23:29

我有一段Python代码,它可以从HP LCR表中获取测量数据,并以不同的方式收集这些数据。最近,我为那些不太会修改代码变量的员工创建了一个图形用户界面(GUI),让他们可以输入初始条件。现在一切都正常,除了一个问题。我们使用的是最新的Python xy,也就是Python 2.6.6,搭配PyQt和Spyder,在Windows 7的电脑上运行。

通常我们会在Spyder中打开代码,但打开Spyder需要一些时间,我的主管更喜欢直接双击文件,这样就能打开带有Python控制台窗口的GUI,控制台可以打印错误信息和其他信息,就像在Spyder中看到的一样。

从提供的截图可以看到,有一个初始机器设置模式,用于设置要被LCR表扫描的设备,并且代码会提示用户输入两个内容。在Spyder中,这些提示在控制台中显示得很好,但在没有Spyder的Python控制台中,它不断打印 QCoreApplication::exec: The event loop is already running。奇怪的是,你仍然可以像往常一样按两次回车,代码就会正常运行。但这对除了我以外的所有人来说都会很困惑。

有没有人知道为什么会出现这种情况?

这里是输出的图片

这是提示输入的代码。

    lcr = visa.instrument('GPIB::17')
        #clear the instrument
        lcr.write('*RST;*CLS')
        #enable operation complete notification
        lcr.write('*OPC')
        if parallel:
            lcr.write('FUNC:IMP CPG')   #Parallel capacitance, conductance model
        else:
            lcr.write('FUNC:IMP CSRS')   #Series capacitance, resistance model
        lcr.write('APER '+integration+','+averages)
        lcr.write('OUTP:HPOW ON')
        lcr.write('OUTP:DC:ISOL OFF')
        lcr.write('VOLT '+vac)
        lcr.write('TRIG:SOUR BUS')

        if zero == True:
            #set open correction parameters
            lcr.write('DISP:PAGE CSET')
            lcr.write('CORR:LENG 1')
            lcr.write('CORR:METH SING')
            lcr.write('CORR:LOAD CPG')
            lcr.write('CORR:USE 10') 
            lcr.write('CORR:SPOT1:STATE ON')    
            lcr.write('CORR:SPOT2:STATE OFF')    
            lcr.write('CORR:SPOT3:STATE OFF')
            lcr.write('CORR:SPOT1:FREQ '+frequency)
            #perform open correction -> unprobe device\   
            raw_input('Unprobe DUT and press ENTER to continue...')
            lcr.write('CORR:SPOT1:OPEN')
            lcr.write('CORR:OPEN:STATE ON')
            lcr.write('DISP:PAGE MEAS')
            #poll lcr to determine measurment state
            lcr.write('*OPC?')    
            done = lcr.read()    
            while done == 0:
                lcr.write('*OPC?')
                done = lcr.read()        
                time.sleep(0.5)
            #reprobe device                                
            raw_input('Probe DUT, then press ENTER')                
        lcr.write('FREQ '+frequency)

这些提示就是两个 raw_input()

1 个回答

2

你在控制台里看到不断的消息,是因为系统日志和你的应用程序使用的是同一个输出流。

Spyder是一个很不错的程序,它在QT窗口中嵌入了IPython或Python(作为备份)控制台。你也可以用类似的方法,只需使用Qt4来绘制一个窗口,其中包含IPython控制台。

你需要做的事情是这个(来源):

def embed_ipython(window):
    "wrapper funcs - works < IPython 0.11"
    from IPython.Shell import IPShellEmbed
    ipshell = IPShellEmbed(user_ns = dict(w = window))
    ipshell()

这里的‘window’是你想要暴露给IPython的一个中心对象(用于操作、测试各种方法等)。

GUI应用程序的初始化大致是这样的:

if __name__ == "__main__":
    import sys
    from PyQt4 import QtGui
    app = QtGui.QApplication(sys.argv)
    window = QtGui.QMainWindow()
    window.show()
    embed_ipython(window)
    sys.exit(app.exec_())

一些额外的阅读资料:

撰写回答