Category: Python

  • RESTful API를 이용하여 PostgreSQL 자료 입력

    psycopg2 를 이용하면 편하게 PostgreSQL에 접근하여 자료를 다룰 수 있다. 편하게 이용할 수 있는 방법인 반면에 DB 접속 권한이 노출된다는 단점이 있다.

    따라서, PostgreSQL이 설치된 서버에 RESTful API를 이용하여 자료를 전달하도록 한다. 보안 접속은 차차 구현해 보기로 하고, 기본형으로 시작한다.

    찾아보면 더 좋은게 있을지도 모르겠다. 최근까지 업데이트 흔적이 있고, 스폰서가 있는 PostgREST를 이용해 보기로 했다. 예제는 다음을 참고했다.

    https://postgrest.org/en/stable/tutorials/tut0.html

    설치 파일을 다운 받는다.

    https://github.com/PostgREST/postgrest/releases/tag/v7.0.1

    tar.xz 파일이 이상하게도 압축이 안풀려서 Windows에서 풀어서 설치 파일을 복사해서 사용했다. 환경 설정 파일 없이 실행하면 친절하게 최소한의 옵션에 따라서 환경 설정 파일을 만들라고 한다. 사용자 계정, 계정의 비밀번호, DB 이름, 스키마 이름, role을 지정한다.

    $ nano tutorial.conf
    db-uri = "postgres://user:pass@localhost:5432/dbname"
    db-schema = "public" 
    db-anon-role = "postgres"

    작성 후 실행한다. 적절하게 만들어졌다면 다음과 같이 실행된다. 기본적으로 3000 포트를 이용한다.

    $ ./postgrest tutorial.conf
    Attempting to connect to the database...
    Listening on port 3000
    Connection successful

    curl을 이용해서 테이블을 조회하여 본다. tablename이라는 테이블 내용을 조회하고 싶다면 다음과 같이 실행한다.

    $ curl http://server:3000/tablename

    JSON 포맷으로 tablename 테이블에 자료를 입력(POST)하고 싶다면 다음과 같이 입력한다.

    $ curl http://server:3000/tablename -X POST \
    -H "Content-Type: application/json" \
    -d '{"source_id": "200",
         "person_id": "15258756"}'

    테이블 이름이 tablename이고, col1의 값이 1234인 열의 자료를 조회하고 싶다면 다음과 같이 한다. 연산자는 다음의 링크를 참조한다.

    https://postgrest.org/en/v7.0.0/api.html

    $ curl http://server:3000/tablename?col1=eq.1234

    파이썬에서는 다음과 같이 한다. requests를 이용한다. POST는 다음과 같이 하면 된다.

    >>> import requests
    >>> requests.post('http://server:3000/tablename ', data={'col1': '1234'})

    GET을 하는 방법은 2가지 방법이 있는 것 같은데 일단은 curl을 시도한 것과 유사한 형식으로 하면 된다. JSON 포맷으로 받으려면 다음과 같이 한다.

    >>> tmp = requests.get('http://server:3000/tablename?col1=eq.1234').json()
    >>> tmp[0]['col1'] 
  • Python에서 QR코드 만들기

    지난번에는 바코드를 만들어 보았으니 이번에는 QR코드를 만들어 본다. 파이썬에는 qrcode와 PyQRCode 모듈이 검색이 된다. 이 중에서 qrcode가 비교적 최근에 업데이트한 흔적이 있으므로 이것을 선택하였다. PIP로 설치한다.

    $ pip3 install qrcode

    https://pypi.org/project/qrcode/

    홈페이지에 들어가면 추가 옵션이 더 기술되어 있다. 필요하면 참고하자.

    QR코드에는 많은 내용을 넣을 수 있는 것이 장점이다. 그리고 의외의 것으로 웹 사이트 링크를 연결하는 방법은 설명을 찾기가 힘들다. 그냥 http://www.example.net 이나 http://www.example.net/ddd.html 과 같은 형식으로 만들면 연결이 된다. 파일 저장은 .save를 붙여서 한다.

    >>> import qrcode
    >>> img = qrcode.make('http://10.10.10.82')
    >>> img.save('qr.png')
  • 바코드 만들기

    Python에서 바코드는 비교적 쉽게 만들 수 있다. 우선 PIP로 패키지를 설치한다.

    $ pip3 install python-barcode

    예를 들어 CODE-128 규격의 바코드를 PNG 포맷으로 저장하기 위해서는 다음과 같이 한다.

    >>> import barcode
    >>> barcode.get('code128', 문구, writer=barcode.writer.ImageWriter()).save(경로)

    이 다음에는 그림 파일을 잘 정렬하면 된다. 세포 진단 확인할 때마다 불편해서, 버티다가 이번에 만들어 보았다.

  • 키보드 입력을 Python에서 이용하기

    Linux의 Python에서 키보드나 마우스, 기타 장치의 입력을 받아서 이용하고 싶을 때가 있다.

    이러한 입력은 /dev/input 하위의 여러 장치로 들어온다. 이 폴더들은 기본적으로 root 소유이며 755 속성을 가지고 있다. chmod로 속성을 변경하여도 재부팅하면 다시 돌아온다. 따라서 주로 이용하는 계정에 권한을 부여하는 방법을 이용한다. 다음과 같이 계정에 input 권한을 준다.

    $ sudo adduser 계정 input

    다음으로 PIP로 evdev를 설치한다.

    $ pip3 install evdev

    장치에 배정된 event 번호를 알기 위해서 Python에서 다음의 코드를 실행한다. 주의할 점은 부팅 이후에 장치를 연결한 경우와 부팅 과정에서부터 연결된 경우는 순서가 바뀔 수 있다는 것이다. 구글 검색을 하면 나오는 명령어와 거의 유사한데, 버전이 업그레이드 되면서 device.path로 변경하도록 하는 메세지가 나오니 해당 내용에 맞추어 존다.

    >>> devices = [evdev.InputDevice(path) for path in evdev.list_devices()]
    >>> for device in devices:
    
            print(device.path, device.name, device.phys)

    원하는 장치를 다음과 같이 지정해 준다.

    >>> dev = evdev.InputDevice('/dev/input/event0')

    키보드 입력에 대한 예제가 많이 있고, 보통 다음과 같이 loop를 돌려서 입력 결과를 받는다. list 형식으로 받아서 이용하는 것이 일반적인 것 같다. key_down과 key_up 등이 나오는데 구글 검색으로는 보통 key_down를 이용하는 것 같다. 아마도, 키보드를 누르면서 입력하는 것이니 그렇게 처리되는게 아닌가 싶었다.

    입력 값들을 모으기 위해서는 보통 .keystate == 1를 이용하는 것 같다.

    >>> for event in device.read_loop():
            if event.type == evdev.ecodes.EV_KEY:
                inputs = evdev.categorize(event)
                print(inputs)
                if inputs.keystate == 1:
                    text += inputs.keycode