当我添加一个看似无关的部分时,为什么我的Python代码的一部分被解释不同?

时间:2016-07-15 20:32:36

标签: python interpreter visa gpib

一些背景知识:我实现了一个GUI,通过GPIB与设备进行交互。问题出现在这种方法中:

from tkinter import *
from tkinter import ttk
import visa #PyVisa Package. pyvisa.readthedocs.io
from time import sleep
import numpy as np #NumPy Package. Scipy.org

def oneDSweep():
Voltage =[]
Current =[]
Source = []
try:
    #Gate = parseGate(Gate1Input.get()) #Not implemented yet.
    Min = float(Gate1MinInput.get()) #Add a check for valid input
    #if Min < .001:
            #Throw exception
    Max = float(Gate1MaxInput.get()) #Add a check for valid input
    VoltageInterval = .02 #Prompt user for interval?
    rm = visa.ResourceManager()
    SIM900 = rm.open_resource("GPIB0::1::INSTR") #Add a check that session is open.

    x = 0
    Volt = Min
    while Volt <= Max:
        SIM900.write("SNDT 1, 'VOLT " + str(Volt) + "'") #Set voltage.
        SIM900.write("SNDT 7, 'VOLT? 1'") #Ask a port for voltage.
        Vnow = SIM900.query("GETN? 7, 50") #Retrieve data from previous port.
        Vnow = Vnow[6:15]
        Vnow = float(Vnow) ############Error location
        Voltage = np.append(Voltage, Vnow)

        SIM900.write("SNDT 1, 'VOLT?'") #Ask a different port for voltage.
        Snow = SIM900.query("GETN? 1, 50") #Retrieve data.
        print(Snow) #Debugging method. Probably not problematic.
        Snow = Snow[4:]
        Snow = float(Snow)

        sleep(1) #Add a delay for science reasons.
        #The code below helps the while loop act like a for loop.
        x = x+1
        Volt = Min + VoltageInterval*x
        Volt = float(truncate(Volt, 7))

finally:
    print(Voltage)
    print(Source)
    Voltage.tofile("output.txt.",sep=",")
    SIM900.write("FLSH")#Flush the ports' memories to ensure no bad data stays there.

在while循环的第一次传递期间,我在标记的位置得到一个简单的ValueError; Python说它无法将字符串转换为浮点数(稍后会详细介绍)。但是,只需删除这五行代码:

    SIM900.write("SNDT 1, 'VOLT?'")
    Snow = SIM900.query("GETN? 1, 50")
    print(Snow)
    Snow = Snow[4:]
    Snow = float(Snow)

并且程序运行完美。我理解错误的来源。添加这些行后,当我将这两行发送到我的乐器时:

    SIM900.write("SNDT 7, 'VOLT? 1'")
    Vnow = SIM900.query("GETN? 7, 50")

我基本上是一个空错误。返回#3000,这是机器在被要求输出数据时发送的空白消息,并且没有输出。但是,当我提到的四行从程序中排除时,这两条相同的行会产生类似#3006 00.003的行。换句话说,简单地将这四行添加到我的程序中已经改变了在while循环开始时发送到乐器的消息,尽管它们在最后添加它们。

我确信Python的解释器在这里有问题。早些时候,我正在清理我的代码并发现当从'更改为"时,一组特定的引号会产生同样的错误,尽管没有其他引用对表现出这种行为,即使在相同的情况下也是如此线。我的问题是,为什么我的代码的执行会根据对代码的无关更改而改变(也会感谢修复)?我理解这个问题很难复制,因为我的具体应用程序,所以如果有更多的信息可以帮助我,请告诉我。

编辑:从命令提示符移动到IDLE后,功能已得到改进。我仍然对发生的事情感到困惑,但由于我的命令提示能力很差,我无法提供任何证据。请关闭这个问题。

2 个答案:

答案 0 :(得分:2)

Python正在告诉您代码的确切错误 - ValueError。它甚至可以为您提供确切的行号和导致问题的值。

'#3006 00.003'

这是正在打印的SNOW的值。然后你这样做

SNOW = SNOW[4:]

现在SNOW

'6 00.003'

然后尝试在此字符串上调用float()6 00.003无法转换为浮点数,因为它是一个荒谬的数字。

答案 1 :(得分:2)

  

我确信Python的解释器在这里有问题。早些时候,我正在清理我的代码并发现一个特定的引号集,当从'更改为'时,产生了同样的错误,尽管没有其他引用对表现出这种行为,即使在同一行内也是如此。

Python为单引号和双引号字符串生成完全相同的字节码(当然,除非涉及嵌入式引号)。因此,您运行脚本的环境严重已损坏(我将python解释器视为“环境”的一部分),或者您的诊断不正确。我把钱放在第二个。

这是另一种解释。无论出于何种原因,您连接的硬件都会返回不一致的结果。所以,有一次你得到你所期望的,下次你收到错误时 - 你认为你对代码的更改会导致差异,但是因果关系没有关系,你最终会把你的头发拉出来。当您连续多次运行相同的代码时,您会得到一致的结果吗?即你是否一直得到奇怪的行为?即使你这样做,问题必须是硬件或连接,而不是Python。