2016-07-15 1 views
0

일부 배경 : 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가 표시됩니다. 파이썬은 문자열을 float로 변환 할 수 없다고 말합니다 (자세한 내용은 나중에 설명). 그러나 다음 5 줄의 코드를 제거하면됩니다.

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 루프가 시작될 때 악기가 마지막에 추가 되었음에도 불구하고 메시지가 변경되었습니다.

저는 파이썬의 인터프리터가 잘못되었다고 확신합니다. 이전에 코드를 정리하면서 특정 인용 부호 세트가 '에서 "으로 변경되었을 때 같은 줄 내에서도이 동작을 나타내는 다른 인용문 쌍이 없었음에도 동일한 오류가 발생 함을 발견했습니다. 제 질문은, 왜 내 코드의 실행이 코드와 무관 한 변경에 따라 달라지는 것입니까? 다소 문제가있는 특정 응용 프로그램에 대해서는이 문제를 반복하는 것이 어렵다는 것을 이해합니다. 제공 할 수있는 더 많은 정보가 있다면 알려주십시오.

편집 : 명령 프롬프트에서 IDLE로 이동하면 기능이 향상되었습니다. 나는 아직도 일어난 일에 당황 스럽지만, 빈약 한 명령 프롬프트 기술로 인해 어떤 증거도 제공 할 수 없습니다. 이 질문을 닫으십시오.

+2

오류 및 스택 추적을 게시 할 수 있습니까? 파이썬의 +10 살짜리 전염병 통역사가 고장 났다고 생각하기가 어렵습니다. –

+0

당신이 받고있는 전체 오류 추적을 포함해야합니다. –

+0

문자열에 매핑하기 전에 float의 값을 출력하고 무슨 뜻인지 봅니다. 대부분 숫자가 아닌 문자 –

답변

2

파이썬은 코드에 무엇이 잘못되었는지를 알려주고 있습니다 (ValueError). 심지어는 문제의 원인이되는 정확한 행 번호와 값을 제공합니다.

'#3006 00.003' 

이는 인쇄 할 값인 SNOW입니다. 그럼 당신은이

SNOW = SNOW[4:] 

지금 SNOW 당신은 다음이 문자열에 float()를 호출하려고

'6 00.003' 

하면됩니다. 6 00.003은 무의미한 번호이므로 float로 변환 할 수 없습니다. (내장 따옴표는 물론, 참여하지 않는)

+0

눈의 가치가 아닙니다. 그것은 스노우 블록이 제외되었을 때 Vnow에 대해 얻은 가치입니다. 스노우 블록이 추가되면 Vnow ='# 3000'을 얻습니다. 결과는 null입니다. Snow 블록은 런타임 중에는 다루지 않습니다. V8 블록이 포함되면 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.

파이썬은 단일 및 이중 인용 된 문자열에 대한 정확히 같은 바이트 코드를 생성합니다. 따라서 스크립트를 실행중인 환경이 심각하게 ("환경"의 일부로 파이썬 인터프리터를 계산합니다)이거나 진단이 잘못되었습니다. 나는 두 번째 돈을 썼다.

다른 설명이 있습니다. 어떤 이유에서 건, 연결 한 하드웨어가 일관성없는 결과를 반환하고 있습니다.한 번 당신이 당신이 기대 한 것을 얻었을 때, 다음에 오류가 생길 때 코드의 변경 사항이 차이를 설명한다고 생각하지만 원인과 결과 사이에 아무 관계가 없으므로 결국 머리카락이 빠지게됩니다. 동일한 코드를 번으로 여러 번 실행하면 일관된 결과가 나타 납니까? 나는. 당신은 일관되게 이상한 행동을합니까? 비록 그렇게하더라도, 문제는 파이썬이 아닌 하드웨어 나 연결에 있어야합니다.

+0

예, 일관된 동작을 얻었습니다. 문제는 내가 추가 한 코드는 내가 상호 작용하고있는 악기에 결코 도달하지 못했다는 것입니다. 새로운 코드를 보내면 악기가 동작을 바꿀 수 있지만 추가 된 코드는 악기로 전송되지 않습니다. 전에 올바르게 작동했던 이전 블록이 실패하여 프로그램이 종료되었습니다. –

+0

글쎄, 나는 네가 주장하는 것이 사실이라는 것을 정말로 확신 할 수 있는지 의문이다. stdout과 stderr는 서로 다른 버퍼링 모드를 가지고 있으며 연속적으로 나타날 수 있다는 것을 알고 있습니까?stdout이 아닌 stderr에 인쇄하면 놀라실 수 있습니다. – alexis

+0

흥미 롭 군, 나는 이것을 알지 못했다. 그러나, 문제의 악기로 들어오고 나가는 모든 활동을 모니터하는 제 3 자 도구를 사용하고 있으며 내 이야기를 확인합니다. 이것은 디버깅 할 때 print 서술문이 신뢰할 수 없다는 것을 의미합니까? –

관련 문제