'python'에 해당되는 글 6건

Embedded Linux/Docker

 

Docker에서 python 스크립트를 실행하려고 한다.

1. Docker에 Python 설치

 

(2021-06-03) 기준으로 python.org 에서 release 된 stable 버전은 3.9.5이다.

때문에 docker hub에서 3.9.5 버전의 alpine 버전을 다운로드 받았다.

https://hub.docker.com/_/python

위 링크에서 TAG를 보고 원하는 버전을 선택하면 된다.

docker pull python:3.9-alpine
  • alpine 버전은 alpine 리눅스 기반으로 제작된 이미지라고 한다.
  • 나중에 알게 되었지만, 라즈베리파이에서는 alpine 버전이 동작하지 않았다.
  • python:3.9-slim 으로 다시 설치함

 

2. Docker에서 Python 스크립트 실행

 

Docker build를 해서 custom 컨테이너를 만들고 Python 스크립트를 실행할 예정이다.

python 스크립트

아래처럼 간단하게 python 코드를 작성한다.

print("python app start")

 

우선 잘 동작하나 테스트.

 

 

Dockerfile 작성

 

FROM python:3.9-slim  WORKDIR /home/pi/work/docker COPY . /home/pi/work/docker  CMD ["python", "app.py"]

처음이라 이것저것 넣고 빼고 테스트를 해보았는데, 위에 4개[FROM, WORKDIR, COPY, CMD]가 기본인 듯 하다.

 

이렇게 작성하면 끝

 

Docker build & Run

 

빌드 명령.

docker build -t test1:v3 .

test1은 컨테이너 이름, v3은 태그명 으로 보면 되겠다. 이렇게 빌드하면 아래처럼 확인된다.

 

실행

docker run test1:v3 .

 

 

  • 라즈베리파이에서 python alpine 버전을 사용했을 경우에는 아래처럼 에러가 발생한다.
pi@raspberrypi:~/work/docker $ docker run python:3.9-alpine Fatal Python error: init_interp_main: can't initialize time Python runtime state: core initialized PermissionError: [Errno 1] Operation not permitted  Current thread 0xb6f4b390 (most recent call first): <no Python frame>

 

검색해보니, alpine 버전은 glibc가 아니라 musl libc를 사용해서 C라이브러리 의존성에 문제가 있을 수 있다고 한다.

https://jadehan.tistory.com/58

'Embedded Linux > Docker' 카테고리의 다른 글

Raspberry pi 4에 Docker 설치  (0) 2021.06.03
Embedded Linux/Docker

 

1. Docker 설치

Docker 설치에는 2가지 방법이 있는 것 같다.

 

  • apt를 사용한 설치.
apt install docker.io

 

  • Docker 설치 스크립트를 사용한 설치https://get.docker.com 에서 docker 설치 스크립트를 다운로드 할 수 있다.
    curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh

 

2. 설치 확인

sudo docker --version

 

3. docker 그룹에 사용자 추가

docker 는 root 권한을 실행되기 때문에 sudo 명령이 필요하다.

sudo 없이 사용하기 위해서 user를 docker 그룹에 추가해준다.

sudo usermod -aG docker $USER
  • 라즈베리파이4에서 ssh로 접속하여 docker를 설치했는데, ssh 재접속을 해야만 docker 그룹에 추가된 것을 확인할 수 있다.

 

4. helloworld 테스트

docker에서 제공하는 helloworld 컨테이너를 https://hub.docker.com 에서 다운 받아 동작을 확인할 수 있다.

docker run hello-world

hello-world는 아래처럼 출력된다.

 

 

 

 

'Embedded Linux > Docker' 카테고리의 다른 글

Docker에서 Python 실행하기  (0) 2021.06.03
Study/Python

펌웨어 바이너리 파일 등 hexadecimal 값을 가독성이 좋은 형태로 변환해야 하는 경우가 있다.

 

예를들면

0x00 0x11 0x22 ...  => 001122 의 형태로

 

간단하게

import binascii

binascii.hexlify(), binascii.unhexlify()를 활용하면 된다.

 

 

의 결과 값은 아래와 같다.

 

 

character '1'의 hex 값은 0x31이다.

http://www.asciitable.com/

 

Ascii Table - ASCII character codes and html, octal, hex and decimal chart conversion

ASCII Table and Description ASCII stands for American Standard Code for Information Interchange. Computers can only understand numbers, so an ASCII code is the numerical representation of a character such as 'a' or '@' or an action of some sort. ASCII was

www.asciitable.com

 

 

만약 특정 바이너리 파일을 모두 컨버팅 하기 위해서는 아래와 같이 하면 된다.

결과.

 

'Study > Python' 카테고리의 다른 글

python 함수 주기적으로 실행하기  (0) 2017.01.25
python Queue 사용방법  (0) 2017.01.25
IoT/WiFi

SKT ThingPlug 더 쉽게 시작하기 강의록입니다.


ThingPlug Device로는 Nucleo F411RE와 WizFi310(Embedded WiFi module)을 사용했습니다.


Application은 Python으로 작성한 대시보드를 사용했습니다.



ThingPlug 뿐만 아니라, Arduino, mbed, Embedded WiFi 관련 강의가 준비되어 있습니다.

http://wiznetacademy.com/



(강의록 로딩이 조금 오래 걸립니다.)


Study/Python

python에서 특정 함수를 일정 주기마다 실행하고 싶으면? threading.Timer를 사용해보자


기본 사용방법은 아래와 같다.


import threading

class AsyncTask:
def __init__(self):
pass

def TaskA(self):
print 'Process A'
threading.Timer(1,self.TaskA).start()

def TaskB(self):
print 'Process B'
threading.Timer(3, self.TaskB).start()

def main():
print 'Async Function'
at = AsyncTask()
at.TaskA()
at.TaskB()

if __name__ == '__main__':
main()

수행 결과, TaskA는 1초마다, TaskB는 3초마다 수행되고 있다.


Async Function

Process A

Process B

Process A

Process A

Process B

Process A

Process A

Process A

Process B


핵심은 아래 함수이다.

threading.Timer(1,self.TaskA).start()

함수의 의미는 1초 후에 TaskA를 start하라는 의미이다.

TaskA 함수안에서 threading.Timer를 사용한다면 TaskA는 정해진 시간마다 주기적으로 수행되는 함수가 될 것이다.



가장 중요한 점은, TaskA를 최초의 한번은 수행햐주어야 한다는 점이다.

def main():
print 'Async Function'
at = AsyncTask()
at.TaskA()
at.TaskB()




'Study > Python' 카테고리의 다른 글

python hex값을 hex string으로 변환하기, hexlify(), unhexlify()  (0) 2019.05.07
python Queue 사용방법  (0) 2017.01.25
Study/Python

Python에서 Queue의 기본적인 사용법은 아래와 같다.


import Queue

q = Queue.Queue()

items=list()

items.append('item1')
items.append('item2')
items.append('item3')
items.append('item4')
items.append('item5')

print 'start queue'

for i in items:
q.put(i)

while q.qsize():
print q.get()

print 'end queue'


put() 함수를 사용해서 q(queue)에  item1~item5 까지 put을 수행한다. get() 함수를 사용해서 q를 비운다.

위 코드를 수행하면 아래와 같은 결과가 나온다


item1

item2

item3

item4

item5

end queue


위 동작은 item1~item5 까지를 한번에 모두 Queue에 넣고 한꺼번에 get을 수행하기 때문에 전혀 문제가 없다.


그런데 여러 Thread 상에서 비동기적으로 Queue에 put과 get을 수행해야하는 상황이라면 문제가 생긴다.


put()과 get() 함수가 기본적으로 blocking 함수이기 때문이다.


흔히 발생할 수 있는 상황은, Queue에 데이터가 없는 상황에서 get() 함수를 수행한다면 데이터가 put() 될때까지 blocking 되기 때문에 해당 Thread에서 다른 동작을 수행할 수가 없다.


해결 방법은 get()과 put()을 non-blocking 함수로 바꿔야 하는데, 방법은 아래와 같다.


import Queue

q = Queue.Queue()

items=list()

items.append('item1')
items.append('item2')
items.append('item3')
items.append('item4')
items.append('item5')

print 'start queue'

for i in items:
q.put_nowait(i)

while q.qsize():
print q.get_nowait()

print 'end queue'



1
블로그 이미지

IoT 개발자 블로그이고 싶다.

1byte