2016-07-15 20 views
0

Некоторые предпосылки: Я реализую GUI для взаимодействия с оборудованием через GPIB. Проблема возникает в этом методе:Почему часть кода Python интерпретируется с трудом, когда я добавляю, казалось бы, несвязанную часть?

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. 

я получаю простую ValueError в отмеченном месте во время первого прохода времени цикла; Python говорит, что он не может преобразовать строку в float (подробнее об этом позже). Однако просто удалите эти пять строк кода:

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. Раньше я очищал свой код и обнаружил, что один конкретный набор котировок, когда он изменен с ' на ", произвел эту же ошибку, несмотря на то, что никакая другая пара котировок не демонстрирует такое поведение даже в пределах одной строки. Мой вопрос: почему выполнение моего кода изменяется в зависимости от несвязанных изменений кода (также будет полезно исправить)? Я понимаю, что эту проблему трудно воспроизвести, учитывая мое несколько специфическое приложение, поэтому, если есть больше информации, которая была бы полезной, я могу предоставить, пожалуйста, дайте мне знать.

EDIT: Функциональность улучшилась после перехода из командной строки на IDLE. Я все еще не понимаю, что произошло, но из-за моих скудных навыков командной строки я не могу предоставить никаких доказательств. Пожалуйста, закройте этот вопрос.

+2

Можете ли вы опубликовать сообщение об ошибке и stacktrace? Мне трудно думать, что Python +10-летний, искушенный интерпретатор сломан. –

+0

. Вы должны включить полную трассировку ошибок, которую вы получаете. –

+0

Распечатайте значение float перед тем, как сопоставить его с строкой и посмотреть, что она говорит. Скорее всего, у него есть нечисловые символы –

ответ

2

Python сообщает вам, что именно не так с кодом - ValueError. Он даже дает вам точный номер строки и значение, вызывающее проблему.

'#3006 00.003' 

Это значение SNOW, что в настоящее время печатается. Тогда вы сделаете это

SNOW = SNOW[4:] 

Теперь SNOW является

'6 00.003' 

Затем вы пытаетесь вызвать float() на эту строку. 6 00.003 не может быть преобразован в поплавок, потому что это бессмысленное число.

+0

Это НЕ значение Снега. Это значение, которое я получаю для Vnow, когда исключен блок снега. Когда добавлен блок снега, я получаю Vnow = '# 3000', нулевой результат. Блок Снега никогда не затрагивается во время выполнения, потому что когда он включен, блок Vnow выходит из строя. –

+0

Ну, оба блока взаимодействуют с одним и тем же объектом - «SIM900» - поэтому неудивительно, что добавление или удаление одного блока влияет на другое. Вы подтвердили, что цикл while еще не прошел цикл? Возможно, напечатайте что-то в начале цикла while. –

+0

Да, я тестировал это раньше, работая над доказательством прямо сейчас. –

2

I am convinced that Python's interpreter is at fault here. Earlier, I was cleaning up my code and discovered that one particular set of quotes, when changed from ' to ", produced this same error, despite no other quote pair exhibiting this behavior, even within the same line.

Python генерирует точно такие же байты-код для одиночных и двойных кавычек (если вложенные кавычки не участвует, конечно). Таким образом, либо среда, в которой работает ваш скрипт, находится серьезно сломан (я считаю интерпретатор python как часть «среды»), или ваш диагноз неверен. Я поставил свои деньги на второй.

Вот альтернативное объяснение. По какой-то причине аппаратное обеспечение, которое вы подключили, возвращает непоследовательные результаты.Поэтому, как только вы получите то, что ожидаете, в следующий раз, когда вы получите сообщение об ошибке, вы считаете, что ваши изменения в кодовой учетной записи отличаются от различий, но нет никакой связи между причиной и результатом, и вы в конечном итоге вытаскиваете свои волосы. Когда вы запускаете тот же код несколько раз подряд, вы получаете согласованные результаты? То есть вы постоянно получаете странное поведение? Даже если вы это сделаете, проблема должна быть связана с оборудованием или подключением, а не с Python.

+0

Да, я получил последовательное поведение. Дело в том, что код, который я добавил, никогда не достигал инструмента, с которым я взаимодействовал. Инструмент может изменить поведение при отправке нового кода, но добавленный код никогда не отправлялся на инструмент. Блок до, который ранее работал правильно, не удался и заставил программу выйти. –

+0

Ну, я сомневаюсь, действительно ли вы можете быть уверены, что то, что вы утверждаете, верно. Знаете ли вы, что stdout и stderr имеют разные режимы буферизации и могут появляться непоследовательно?Распечатайте stderr, а не stdout, и вы можете быть удивлены. – alexis

+0

Интересно, я не знал об этом. Тем не менее, я использую сторонний инструмент, который контролирует всю активность в этом и обратно, и это подтверждает мою историю. Означает ли это, что заявления печати ненадежны при отладке? –