프로그래밍 319

[Python] GPIB 를 통한 계측기 제어 실패기

이더넷을 통한 TCPIP 연결로 계측기 제어는 아무런 문제 없이 잘 수행해 왔었는데, 꼭 GPIB로 계측기를 제어해야할 상황이 발생하였습니다. 연결 문자열만 변경하면 특별한 문제 없이 바로 계측기 제어에 문제가 없을줄 알았지만, 연결부터 되지 않아서 몇 일을 헤맸습니다. GPIB 를 통한 계측기 연결을 위해 헤맸던 그 상황들을 기록해 둡니다. GPIB 연결 오류 발생 확인 파이썬을 설치하면 기본 제공되는 "IDLE Shell"에서 "ResourceManager.list_resources()"로 연결된 계측기를 다음과 같이 확인해 보았습니다. Python 3.10.0 (tags/v3.10.0:b494f59, Oct 4 2021, 19:00:18) [MSC v.1929 64 bit (AMD64)] on wi..

[Python] 의도치 않은 모든 예외 기록 처리하기

문제점 try ... catch 를 아무리 잘 이용하더라도 예측하지 못했던 오류가 발생할 수 있습니다. 특히, PyQt 등을 이용한 GUI라면 예측하지 못한 오류로 인하여 GUI가 사라지거나, Flask 등의 웹 서비스라면 서비스가 중단될 수도 있습니다. 이런 경우, 어떤 문제로 인하여 발생한 것인지 확인할 수 있도록 예측하지 못한 모든 예외를 기록하는 방법을 정리해 둡니다. 일반적인 예외 처리 일반적으로 파이썬에서 예외를 처리하기 위해서는 "try... except" 구문을 이용합니다. 다음 예제는 엑셀 시트의 특정 셀에 값을 채워넣는 과정에서 예외를 처리하는 것을 간단하게 보여 줍니다. for row in gain_data_list[1:]: try: sheet.cell(row = row_base, c..

[Python] Python 3.11에서 PySide2 설치 오류 문제

문제점 새로 설치한 PC에서 파이썬 최신 버전인 3.11을 설치한 이후에 PySide2를 설치하려고 하였더니, 다음과 같은 오류가 발생하였습니다. Collecting PyQt5 (from -r .\requirements.txt (line 3)) Using cached PyQt5-5.15.9-cp37-abi3-win_amd64.whl (6.8 MB) ERROR: Could not find a version that satisfies the requirement PySide2 (from versions: none) ERROR: No matching distribution found for PySide2 (utel-tester) PS D:\Dev\python\mini\utel-tester> pip instal..

[Python] PyQt5 - askyesno, showerror, showinfo 대체하기

문제점 "tkinter.messagebox" 내의 askyesno, showerror, showinfo 함수들을 이용하여 메시창 알림을 잘 사용하고 있었습니다. from tkinter.messagebox import askyesno, showerror, showinfo 그런데 메시지 창이 나타나는 위치가 항상 화면에 중간에만 나타나는 문제가 있었습니다. 알림 메시지 창이 해당 함수를 호출하는 창의 중앙에 위치하도록 변경해야 했습니다. parent 매개변수에 부모 객체를 넘겨주면 부모 컨트롤의 중앙에 표시될 것이라는 글을 보고 적용해 보았으나 오류가 발생하였습니다. 해결 과정 "Tkinter, tkmessagebox keeps sending me to the root":https://stackoverflo..

[Python] 클래스 인스턴스 형변환 시, 주의할 점

파이썬에서 형변환은 꼭 필요하지 않습니다. 오히려 리터럴 형식의 변수에 대한 형변환을 제외하고는 굳이 형변환을 권장하지도 않는 것 같습니다.(지금 생각해 보니, 클래스 인스턴스의 형변환 자체가 필요없기도 하거니, 그런 문법이 없군요. ^^;) 특히나 클래스 인스턴스에 대한 형변환은 무의미할 정도입니다. 다음과 같은 코드를 보면, 어디서 문제가 있는지 감이 오신다면 다행이지만 저와 같이 델파이(파스칼)에 더 익숙한 개발자라면 도대체 문제가 뭔지 알 수가 없을 수 있습니다. (저도 왜 이게 문제가 되는 잘 몰랐습니다. ^^;) def handleGroupboxAllClick(self) -> None: """ 그룹박스 내 모든 체크박스의 선택을 토글하는 "All" 버튼 핸들러 : 모든 체크박스 항목의 선택을 ..

[Python] PySide2에서 'Python 코드 보기' 시, uic 관련 오류

문제점 새로 설치한 PC에서 파이썬을 설치한 이후에 PySide2를 설치하고 새로운 폼을 만든 후, "Python 코드 보기"를 실행하였더니, 다음과 같이 "uic"를 찾을 수 없다는 오류가 발생하였습니다. "코드 생성 실패" 오류 메시지 해결 방법 해결 방법은 간단합니다. "uic.exe" 파일을 검색하여 찾아보면, "PySide2" 패키지가 설치된 폴더에 함께 위치해 있습니다. "uic.exe" 파일이 있는 "PySide2" 패키지가 설치된 폴더로 가서, "bin" 폴더를 생성하고, 생성된 "bin" 폴더에 "uic.exe" 파일을 복사해 줍니다. 그리고 난 후, "Python 코드 보기"를 실행했을 때는 정상적으로 코드가 생성되어 표시됩니다.

[Python] Qt - QWidget 사라질 때, 처리하는 방법

개요 부모 클래스를 상속한 하위 클래스에서 여러 컨트롤을 추가하거나, 리소스를 사용하고 반환하려면 일반적으로 생성자에서 사용할 리소스를 만들거나 얻은 후, 소멸자에서 사용한 리소스를 반환하게 됩니다. 하지만, Python의 Qt에서는 gc의 의하여 때에 따라서 소멸자가 제대로 호출되지 않을 수도 있기 때문에 소멸자에서 사용한 리소스를 반환하는 것은 위험하고, 아래에 설명드리는 것과 같이 위젯이 닫힌다는 이벤트에서 처리합니다. QWidget.closeEvent() 오버라이딩 QtWidget에서 closeEvent() 메서드를 오버라이딩하여 위젯이 닫힐 때 필요한 작업(리소스 반환 등)을 수행할 수 있습니다. closeEvent() 메서드는 위젯이 닫힐 때 호출되는 이벤트 핸들러로서, 이 메서드를 오버라이딩..

[Python] JSON 문자열 다루기

개요 JSON 문자열을 dict로 변환하거나, 반대로 dict를 JSON 문자열로 변한하여 처리하는 방법을 알아보겠습니다. dict를 JSON 문자열로 변환하기 간단하게 json.dumps() 함수를 이용하면 됩니다. from json import dumps json_str = dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) print(json_str) """ Result>>> ["foo", {"bar": ["baz", null, 1.0, 2]}] """ 주의할 점은 한글과 같이 UTF 문자열 데이터가 포함되어 있는 dict를 dumps() 함수로 문자열로 변환을 시도하면 다음과 같이 인코딩되어 변환되기 때문에 바로 읽을 수가 없게 됩니다. from json impor..

[Python] E8363C Network Analyzer 화면캡쳐하기 (PyVISA)

개요 PyVISA를 이용하여 E8363C Network Analyzer 계측기의 현재 화면을 그대로 캡쳐하여 가져오는 방법을 알아 보도록 하겠습니다. 반복되는 내용은 이전 글인 "E4446A Spectrum Analyzer 화면캡쳐하기 (PyVISA)"를 참고하시기 바랍니다. SCPI 명령을 이용한 화면캡쳐하기 아래는 E8363C Network Analyzer 계측기의 현재 화면을 캡쳐하여 가져와 파일로 저장하는 코드입니다. from pyvisa import ResourceManager _host = '192.168.0.47' _port = 5000 rm = ResourceManager() # visa 객체를 생성합니다. # 지정한 HOST와 PORT를 사용하여 계측기에 접속합니다. pna_client ..

[Python] E4446A Spectrum Analyzer 화면캡쳐하기 (PyVISA)

개요 PyVISA를 이용하여 E4446A Spectrum Analyzer 계측기의 현재 화면을 그대로 캡쳐하여 가져오는 방법을 알아 보도록 하겠습니다. SCPI 명령을 이용한 화면캡쳐하기 아래는 E4446A Spectrum Analyzer 계측기의 현재 화면을 캡쳐하여 가져와 파일로 저장하는 코드입니다. from pyvisa import ResourceManager _host = '192.168.0.47' _port = 5025 rm = ResourceManager() # visa 객체를 생성합니다. # 지정한 HOST와 PORT를 사용하여 서버에 접속합니다. psa_client = rm.open_resource(f'TCPIP{_port}::{_host}::INSTR') print (psa_client...

728x90