레이블이 Lang-Python인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Lang-Python인 게시물을 표시합니다. 모든 게시물 표시

5/01/2021

ESP32 OpenOCD 및 Python 관리

1. ESP32 OpenOCD 와 GDBGUI 재시도

OpenOCD를 이용하여, TCL/GDB를 연결하여 기본동작이 되는 것 까지는 확인이 되지만, 나의 목적인 GDBGUI를 사용하는 것에는 실패를 하였기 때문에, 
이부분에 대해서 다시 시도를 함 

이전 ESP32 OpenOCD 와 GDB 구성 참조 

ESP32 OpenOCD JTAG 관련내용 
 

이전에 이해가 되지 않는 부분이 gdb를 실행하는데, python library 2가 필요로 하는 것이 이해가 되지 않았다. 
그래서, 현재 Ubuntu 20.04에서 Python3.8 사용하지만, 별도로 Python2.7기반으로 변경한 후 다시 virtual env를 만들어 테스트를 해보려고 한다. 


1.1  Python의 Version 관리 

Python은 Python2.7과 Python 3.x Version으로 나누어 볼수 있겠으며, pip2 와 pip3도 별도로 나누어 볼 수 있겠다. 
동시에 사용하고자 한다면, 별도로 각각 설치를 해주고,  /usr/bin/python에 link를 만들어주면된다.

  • Ubuntu 20.04의 Python 현재 상태 확인 
우선 나의 Python의 상태를 확인을 해보면, python3만 지원되며, python은 링크가 없다. 

$ ll /usr/bin/py*
-rwxr-xr-x 1 root root    7813  3월 13  2020 /usr/bin/py3clean*
-rwxr-xr-x 1 root root   12120  3월 13  2020 /usr/bin/py3compile*
lrwxrwxrwx 1 root root      31 12월 15 22:18 /usr/bin/py3versions -> ../share/python3/py3versions.py*
lrwxrwxrwx 1 root root       8 12월 15 22:18 /usr/bin/pydoc3 -> pydoc3.8*
-rwxr-xr-x 1 root root      79  1월 28 00:41 /usr/bin/pydoc3.8*
lrwxrwxrwx 1 root root      12 12월 15 22:18 /usr/bin/pygettext3 -> pygettext3.8*
-rwxr-xr-x 1 root root   21535  1월 28 00:41 /usr/bin/pygettext3.8*
-rwxr-xr-x 1 root root     372  4월  6  2020 /usr/bin/pyjwt3*
lrwxrwxrwx 1 root root       9 12월 15 22:18 /usr/bin/python3 -> python3.8*
lrwxrwxrwx 1 root root      16  3월 13  2020 /usr/bin/python3-config -> python3.8-config*
-rwxr-xr-x 1 root root     384  3월 28  2020 /usr/bin/python3-futurize*
-rwxr-xr-x 1 root root     388  3월 28  2020 /usr/bin/python3-pasteurize*
-rwxr-xr-x 1 root root 5486384  1월 28 00:41 /usr/bin/python3.8*
lrwxrwxrwx 1 root root      33  1월 28 00:41 /usr/bin/python3.8-config -> x86_64-linux-gnu-python3.8-config*
lrwxrwxrwx 1 root root      10  3월 13  2020 /usr/bin/pyvenv -> pyvenv-3.8

$ python  //python command로는 동작안되며, python3 만 되며, 아래와 같이 별도의 package를 설치하라고 함

Command 'python' not found, did you mean:

  command 'python3' from deb python3
  command 'python' from deb python-is-python3
  
$ pip

Command 'pip' not found, but there are 18 similar ones.  
  
$ pip3 list
Package                 Version             
----------------------- --------------------
appdirs                 1.4.4               
apturl                  0.5.2               
bcrypt                  3.1.7               
blinker                 1.4                 
Brlapi                  0.7.0               
Brotli                  1.0.9               
certifi                 2019.11.28          
chardet                 3.0.4               
Click                   7.0                 
colorama                0.4.3               
command-not-found       0.3                 
cryptography            2.8                 
cupshelpers             1.0                 
dbus-python             1.2.16              
defer                   1.0.6               
distlib                 0.3.1               
distro                  1.4.0               
distro-info             0.23ubuntu1         
dnspython               2.1.0               
duplicity               0.8.12.0            
entrypoints             0.3                 
eventlet                0.25.2              
fasteners               0.14.1              
filelock                3.0.12              
Flask                   0.12.5              
Flask-Compress          1.9.0               
Flask-SocketIO          2.9.6               
future                  0.18.2              
gdbgui                  0.14.0.2            
gevent                  1.5.0               
gevent-websocket        0.10.1              
greenlet                0.4.16              
httplib2                0.14.0              
idna                    2.8                 
itsdangerous            1.1.0               
Jinja2                  2.11.3              
keyring                 18.0.1              
language-selector       0.1                 
launchpadlib            1.10.13             
lazr.restfulclient      0.14.2              
lazr.uri                1.0.3               
lockfile                0.12.2              
louis                   3.12.0              
macaroonbakery          1.3.1               
Mako                    1.1.0               
MarkupSafe              1.1.0               
monotonic               1.5                 
netifaces               0.10.4              
oauthlib                3.1.0               
olefile                 0.46                
paramiko                2.6.0               
pexpect                 4.6.0               
Pillow                  7.0.0               
pip                     20.0.2              
pipx                    0.12.3.1            
protobuf                3.6.1               
pycairo                 1.16.2              
pycups                  1.9.73              
pygdbmi                 0.10.0.0            
Pygments                2.8.1               
PyGObject               3.36.0              
PyJWT                   1.7.1               
pymacaroons             0.13.0              
PyNaCl                  1.3.0               
pyRFC3339               1.1                 
python-apt              2.0.0+ubuntu0.20.4.3
python-dateutil         2.7.3               
python-debian           0.1.36ubuntu1       
python-engineio         3.14.2              
python-socketio         4.6.1               
pytz                    2019.3              
pyxdg                   0.26                
PyYAML                  5.3.1               
reportlab               3.5.34              
requests                2.22.0              
requests-unixsocket     0.2.0               
screen-resolution-extra 0.0.0               
SecretStorage           2.3.1               
setuptools              45.2.0              
simplejson              3.16.0              
six                     1.14.0              
systemd-python          234                 
ubuntu-advantage-tools  20.3                
ubuntu-drivers-common   0.0.0               
ufw                     0.36                
unattended-upgrades     0.1                 
urllib3                 1.25.8              
usb-creator             0.3.7               
virtualenv              20.4.3              
wadllib                 1.3.3               
Werkzeug                0.16.1              
wheel                   0.34.2              
xkit                    0.0.0   
  
$ which python

$ sudo apt install python2 //별도 python2.7 설치 후 호환성때문이지 다시 확인     

$ ll /usr/bin/py*
-rwxr-xr-x 1 root root    7813  3월 13  2020 /usr/bin/py3clean*
-rwxr-xr-x 1 root root   12120  3월 13  2020 /usr/bin/py3compile*
lrwxrwxrwx 1 root root      31 12월 15 22:18 /usr/bin/py3versions -> ../share/python3/py3versions.py*
-rwxr-xr-x 1 root root    4124  3월 13  2020 /usr/bin/pyclean*
-rwxr-xr-x 1 root root   11895  3월 13  2020 /usr/bin/pycompile*
lrwxrwxrwx 1 root root       8  3월 13  2020 /usr/bin/pydoc2 -> pydoc2.7*
-rwxr-xr-x 1 root root      79  3월  8 22:02 /usr/bin/pydoc2.7*
lrwxrwxrwx 1 root root       8 12월 15 22:18 /usr/bin/pydoc3 -> pydoc3.8*
-rwxr-xr-x 1 root root      79  1월 28 00:41 /usr/bin/pydoc3.8*
lrwxrwxrwx 1 root root      12  3월 13  2020 /usr/bin/pygettext2 -> pygettext2.7*
-rwxr-xr-x 1 root root   22082  3월  8 22:02 /usr/bin/pygettext2.7*
lrwxrwxrwx 1 root root      12 12월 15 22:18 /usr/bin/pygettext3 -> pygettext3.8*
-rwxr-xr-x 1 root root   21535  1월 28 00:41 /usr/bin/pygettext3.8*
-rwxr-xr-x 1 root root     372  4월  6  2020 /usr/bin/pyjwt3*
lrwxrwxrwx 1 root root       9  3월 13  2020 /usr/bin/python2 -> python2.7*
-rwxr-xr-x 1 root root 3674216  3월  8 22:02 /usr/bin/python2.7*
lrwxrwxrwx 1 root root       9 12월 15 22:18 /usr/bin/python3 -> python3.8*
lrwxrwxrwx 1 root root      16  3월 13  2020 /usr/bin/python3-config -> python3.8-config*
-rwxr-xr-x 1 root root     384  3월 28  2020 /usr/bin/python3-futurize*
-rwxr-xr-x 1 root root     388  3월 28  2020 /usr/bin/python3-pasteurize*
-rwxr-xr-x 1 root root 5486384  1월 28 00:41 /usr/bin/python3.8*
lrwxrwxrwx 1 root root      33  1월 28 00:41 /usr/bin/python3.8-config -> x86_64-linux-gnu-python3.8-config*
lrwxrwxrwx 1 root root      10  3월 13  2020 /usr/bin/pyvenv -> pyvenv-3.8
lrwxrwxrwx 1 root root      29  3월 13  2020 /usr/bin/pyversions -> ../share/python/pyversions.py*

$ sudo ln -s /usr/bin/python2 /usr/bin/python

python package 


9/10/2019

Anacoda 관련사용법 및 virtual 환경 자료수집

1. Python 의 기본내용

최근 리눅스에서 Machine/Deep Learning하면서 conda를 많이 사용하는데, conda와 pip로 분리되어 각각의 Package를 관리되는 것을 비교해보자.

  • Python 기본설명 및 용어
Python에 관련된 기본설명과 용어들을 알아두자 (Python2는 항상 호환문제로 사용)

  • Python 자료모음 및 관련링크 
Python Programing 할때 문법을 비롯하여, 각 예제 및 사용법에 대한 링크연결 


1.1  Anaconda download 및 설치 

두가지 배포판으로 제공해주고 있으며, 아래의 사이트에서 쉽게 Download 및 설치가 가능하다

  1. Python 3.7 Version : Anaconda3.date.OS.Arch
  2. Python 2.7 Version:  Anaconda2.date.OS.Arch

Anaconda Download
  https://www.anaconda.com/distribution/#download-section
  https://repo.anaconda.com/archive/

Anacoda의 사이트 및 소개
  https://www.anaconda.com/

  • Anaconda 설치방법 (Ubuntu 기반)
아래와 같이 쉽게 설치가 가능하며, 설치된 후에는 쉽게 관리가능
$ cd /tmp

$ curl -O https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh        // Python 3.7 

$ sha256sum Anaconda3-2019.03-Linux-x86_64.sh    // checksum 확인 

$ bash Anaconda3-2019.03-Linux-x86_64.sh // 설치진행 

$ conda list // 설치 후 package 확인 

출처: Anaconda 설치 방법
  https://www.digitalocean.com/community/tutorials/how-to-install-anaconda-on-ubuntu-18-04-quickstart


1.2 conda 와 pip 기본비교 

Machine Learning 을 위한 python virtual 환경을 찾다가 대부분 Anaconda로 사용해서 이를 구성을 하는 것 같은데, 이에 대해 좀 더 자세히 알고자 한다.
Anaconda는 일반적으로 conda도 package를 관리하며,  pip인 python의 package 방식과 유사하지만, 다른부분이 많아 이를 비교한다. 


  • Conda 와 pip 의 기본비교 
관련부터 conda는 bin / pip는 wheel or source 이며, conda가 아래를 봐도 다양하게 지원가능하다
virtulenv는 pip는 별도로 설치를 해야하지만, conda는 내부 내장이며, 압도적으로 성능 좋을 것으로 보인다. 

https://www.anaconda.com/blog/understanding-conda-and-pip



  • Tensorflow을 위한 pip 와 anaconda 성능비교 
python package tool인 pip와 conda의 성능비교라고 하며, 성능차이가 나는데 정확한 원인은 anaconda를 좀 더 알아봐야 할 것 같지만,
상위 비교를 보면 대충은 이해는 가는 것 같다. 

https://www.anaconda.com/blog/tensorflow-in-anaconda

  • conda의 기능과 역할 
현재 대체적으로 Mahcine Learning 기반에서 많이 사용되어지며, 내부 Package 역시 Machine Learning에 꼭 필요한 Package 구성이다.
그래서 Tensorflow의 경우 반드시 필요 


1.3  conda 와 pip 사용법 비교 

python의 pip 처럼 conda를 기반으로 설치가 가능하며, 본인이 원하는 환경을 구성하여 각각의 version을 설정도 가능하다고 한다.

  • conda / pip package 기본관리 
python의 pip 와 거의 동일하게 package를 설치/제거/찾기

$ conda install package   // pip install 
$ conda remove package    // pip uninstall 
$ conda list              // pip list 
$ conda search package    // pip search 


  • conda 의 일반 명령어  
conda의 세부명령어들은 아래사이트에서 참조 
  https://docs.conda.io/projects/conda/en/latest/commands.html#conda-general-commands


  • conda 와 pip 의 동작비교 


Task

Conda package and environment manager command

Pip package manager command

Virtualenv environment manager command

Install a package

conda install $PACKAGE_NAME

pip install $PACKAGE_NAME

X

Update a package

conda update --name $ENVIRONMENT_NAME $PACKAGE_NAME

pip install --upgrade $PACKAGE_NAME

X

Update package manager

conda update conda

Linux/macOS: pip install -U pip Win: python -m pip install -U pip

X

Uninstall a package

conda remove --name $ENVIRONMENT_NAME $PACKAGE_NAME

pip uninstall $PACKAGE_NAME

X

Create an environment

conda create --name $ENVIRONMENT_NAME python

X

cd $ENV_BASE_DIR; virtualenv $ENVIRONMENT_NAME

Activate an environment

conda activate $ENVIRONMENT_NAME*

X

source $ENV_BASE_DIR/$ENVIRONMENT_NAME/bin/activate

Deactivate an environment

conda deactivate

X

deactivate

Search available packages

conda search $SEARCH_TERM

pip search $SEARCH_TERM

X

Install package from specific source

conda install --channel $URL $PACKAGE_NAME

pip install --index-url $URL $PACKAGE_NAME

X

List installed packages

conda list --name $ENVIRONMENT_NAME

pip list

X

Create requirements file

conda list --export

pip freeze

X

List all environments

conda info --envs

X

Install virtualenv wrapper, then lsvirtualenv

Install other package manager

conda install pip

pip install conda

X

Install Python

conda install python=x.x

X

X

Update Python

conda update python*

X

X

conda activate only works on conda 4.6 and later versions. For conda versions prior to 4.6, type:

출처:conda의 관련 command 및 pip와 비교 


1.4 conda 설치후 Tensorflow 관련설정

conda 설치 진행후 tensorflow를 사용하기 위해서 관련부분 설치 진행 
  • 나만의 환경구성 
$ conda list | grep python 
ipython                   7.6.1            py37h39e3cac_0  
ipython_genutils          0.2.0                    py37_0  
msgpack-python            0.6.1            py37hfd86e86_1  
python                    3.7.3                h0371630_0  
python-dateutil           2.8.0                    py37_0  
python-libarchive-c       2.8                     py37_11  

$ conda create --name my_env python=3
$ conda activate my_env


$ conda create -n tensorflow_gpuenv tensorflow-gpu    // tensorflow_gpuenv 환경 만들고 필요한 package를 tensorflow-gpu 설정 
$ conda activate tensorflow_gpuenv   // 나만의 환경설정으로 시작 

출처
  https://www.anaconda.com/tensorflow-in-anaconda/

  • TensorBoard 기본사용법
Tensorflow의 Tensorboard 사용법들 관련링크 중요 
  https://medium.com/trackin-datalabs/tensorboard-tensorboard-%EA%B8%B0%EC%B4%88-6163e1642bb0
  https://medium.com/trackin-datalabs/tensorboard-%EA%B0%84%EB%8B%A8%ED%9E%88-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-18a4fda2efb1
  https://pinkwink.kr/1086
  https://pythonkim.tistory.com/39


1.5 Pycharm 기반의 Conda 관련내용 링크 


Pycharm 기반의 Conda
  https://www.anaconda.com/pycharm
  https://itsfoss.com/install-pycharm-ubuntu/
  https://itsfoss.com/install-pycharm-ubuntu/



2. Python 의 가상환경 구성 및 관리방법 

Anaconda 를 비롯하여 여러가지 Virtual 환경을 제공을 하고 있으며, Python의 Package들을 독립적으로 Virtual 환경마다 관리가 가능하기때문에 편리하다.
최근에는 주로 사용하는 Vritual 환경은 pip 기반의 virtualenv/venv 와 conda 기반으로 사용하며, 각각의 기능을 알아보자.
venv와 conda 중심으로 알아가면될 것 같다. 

  • Python 다양한 Virtual 환경 비교
pyenv/virtualenv/venv/conda 비교 및 기본이해
  https://wikidocs.net/16402



  • Python Package는 전체관리와 가상환경관리로 구분 
  1. 전체 관련 Package 관리 
  2. 각 독자 가상환경 구성 후 아래의 명령어로 Package 관리 

  • pip 기반의 package 관리(venv 적용후 관리해도됨)
$ pip install -r requirement.txt
$ pip freeze > requirement.txt 

  • conda 기반의 package 관리(가상환경기반으로해도됨)
$ conda install --file packagelist.txt
$ conda list --export > packagelist.txt 


각 가상환경 기본 사용법 (venv/conda)

  • python3의 venv 설정(가상환경) 및 기본 사용법
$ python3 -m venv 설정이름   // create venv  , virtualenv도 거의 동일
$ source 설정이름/bin/activate   // active 가상환경가동 in Linux
>  설정이름/bin/activate.bat   // active in Window
>  설정이름/bin/activate.ps    // active in Window
$ deactivate     // decativate 가상환경에서 빠져나오기 

  • conda 의 가상환경 및 기본사용법
$ conda create -n 설정이름
$ source activate 설정이름
$ source deactivate


Python 의 pip 와 virtualenv 소개 
  https://medium.com/@dan_kim/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%B4%88%EC%8B%AC%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-pip-%EA%B7%B8%EB%A6%AC%EA%B3%A0-virtualenv-%EC%86%8C%EA%B0%9C-a53512fab3c2

Python virtualenv(Python2) 와 venv (Python3) 사용법 (조금다르나 거의 동일) 

Python Virtualenv 관련내용 

7/24/2019

Gstreamer 의 RTSP Server 구축

1. Gstreamer 기반의 RTSP Server 구축 

  • 우선 Gstreamer 관련 Package 및 관련 Package 설치 진행 
$ sudo apt-get install \ 
     libgstreamer0.10-dev  \ 
     libgstreamer-plugins-base0.10-dev 

$ sudo apt-get install \ 
     libfontconfig1-dev \ 
     libfreetype6-dev \ 
     libpng-dev 

$ sudo apt-get install \
       libcairo2-dev \
       libjpeg-dev \
       libgif-dev 

$ sudo apt-get install libgstreamer-plugins-base1.0-dev

  • Gstreamer 와 RTSP Server library 설치 진행 (Python용도 설치)
$ sudo apt-get install \
    libssl1.0.0 \
    libgstreamer1.0-0 \
    gstreamer1.0-tools \
    gstreamer1.0-plugins-good \
    gstreamer1.0-plugins-bad \
    gstreamer1.0-plugins-ugly \
    gstreamer1.0-libav \
    libgstrtspserver-1.0-0 \
    libjansson4

$ sudo apt-get install python-gst-1.0 python3-gst-1.0

$ sudo apt-get install gir1.2-gst-rtsp-server-1.0

1.1 Gstreamer 기반으로 RTSP Server 동작 

  • 간단하게 아래와 같이 Gstreamer 기반으로 RTSP Server를 구축 
$ gst-launch-1.0 filesrc location=./test.mp4 ! qtdemux name=demux demux.video_0 ! queue ! rtph264pay pt=96 name=pay0 demux.audio_0 ! queue ! rtpmp4apay pt=97 name=pay1 demux.subtitle_0 ! queue ! rtpgstpay pt=98 name=pay2

  • Gstreamer Plugin 관련부분 확인 
  https://gstreamer.freedesktop.org/documentation/plugins_doc.html?gi-language=c






1.2 Python 기반의 RTSP Server 구축 

5/09/2019

pyinstaller (Python Package)

1. pyinstaller 란? 

python으로 작성된 프로그램을 Package 단위로 배포의 편의성을 위해서 사용하는 것 같다.
아래의 사이트에서 글을 읽어보면  목적을 호환성으로 두고있다.

Python은 C Library로 사용이 가능하고, Python 의 내부 Library 가능하기때문에 Python으로만 개발을 진행을 했을 때, 이것을 다른곳에 배포할때 쉽지 않다.
이를 해결해주는 것이 아래의 Tool 이고 실행파일을 만들어준다.

  https://www.pyinstaller.org/

1.1 설치방법 

$ pip install pyinstaller
$ pip list | grep PyInstaller
PyInstaller (3.4)

$ pyinstaller --help
or 
$ ~/.local/bin/pyinstaller --help
usage: pyinstaller [-h] [-v] [-D] [-F] [--specpath DIR] [-n NAME]
                   [--add-data ]
                   [--add-binary ] [-p DIR]
                   [--hidden-import MODULENAME]
                   [--additional-hooks-dir HOOKSPATH]
                   [--runtime-hook RUNTIME_HOOKS] [--exclude-module EXCLUDES]
                   [--key KEY] [-d [{all,imports,bootloader,noarchive}]] [-s]
                   [--noupx] [-c] [-w]
                   [-i ]
                   [--version-file FILE] [-m ] [-r RESOURCE]
                   [--uac-admin] [--uac-uiaccess] [--win-private-assemblies]
                   [--win-no-prefer-redirects]
                   [--osx-bundle-identifier BUNDLE_IDENTIFIER]
                   [--runtime-tmpdir PATH] [--bootloader-ignore-signals]
                   [--distpath DIR] [--workpath WORKPATH] [-y]
                   [--upx-dir UPX_DIR] [-a] [--clean] [--log-level LEVEL]
                   scriptname [scriptname ...]

$ pyinstaller --noconfirm --log-level=WARN \
    --onefile --nowindow \
    --add-data="README:." \
    --add-data="image1.png:img" \               
    --add-binary="libfoo.so:lib" \                  //library 를 추가시  세부 옵션은 아래의 사이트에서 확인 , 사용시, *.spec파일도 변경 
    --hidden-import=secret1 \
    --hidden-import=secret2 \
    --upx-dir=/usr/local/share/ \
    myscript.spec


설치방법
  https://pypi.org/project/PyInstaller/

사용방법- 자세히 읽어보자
  https://pyinstaller.readthedocs.io/en/stable/usage.html

1.2 기본테스트 

간단하게  실행가능한 python을 작성해보고, 이와 관련된 부분들을 Package를 만드는 작업을 해보자.
  • TEST python 작성
$ pip install procfs
$ vi test.py
import io
from procfs import Proc

def JHLEE():
    print "Jeonghun LEE"


if __name__ == "__main__":

   JHLEE()
   proc = Proc()
   print proc.loadavg

$ python test.py
Jeonghun LEE
{'average': {1: 0.08, 5: 0.09, 15: 0.07},
 'entities': {'current': 1, 'total': 423},
 'last_pid': 3833}


  • Package 테스트 
$ pyinstaller test.py
or 
$ ~/.local/bin/pyinstaller test.py  // 실행할 python 
64 INFO: PyInstaller: 3.4
65 INFO: Python: 2.7.12
65 INFO: Platform: Linux-4.4.38-tegra-aarch64-with-Ubuntu-16.04-xenial
66 INFO: wrote /home/nvidia/jhlee/pyinstall/test.spec
90 INFO: UPX is not available.
94 INFO: Extending PYTHONPATH with paths
['/home/nvidia/jhlee/pyinstall', '/home/nvidia/jhlee/pyinstall']
94 INFO: checking Analysis
106 INFO: checking PYZ
112 INFO: checking PKG
113 INFO: Bootloader /home/nvidia/.local/lib/python2.7/site-packages/PyInstaller/bootloader/Linux-64bit-aarch/run
113 INFO: checking EXE
114 INFO: checking COLLECT
WARNING: The output directory "/home/nvidia/jhlee/pyinstall/dist/test" and ALL ITS CONTENTS will be REMOVED! Continue? (y/n)y
5285 INFO: Removing dir /home/nvidia/jhlee/pyinstall/dist/test
5312 INFO: Building COLLECT COLLECT-00.toc
5357 INFO: Building COLLECT COLLECT-00.toc completed successfully.

$ cat test.spec  //pyinstaller 상위 실행으로 생성 
# -*- mode: python -*-

block_cipher = None


a = Analysis(['test.py'],
             pathex=['/home/nvidia/jhlee/pyinstall'],
             binaries=[],                        //binaries=[('foo.so', 'lib')],  직접 추가해도 됨 
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='test',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='test')


  • 생성된 Package 부분 확인 및 실행 

$ ls dist/test/
bz2.aarch64-linux-gnu.so              _codecs_tw.aarch64-linux-gnu.so       libtinfo.so.5
_codecs_cn.aarch64-linux-gnu.so       _hashlib.aarch64-linux-gnu.so         libz.so.1
_codecs_hk.aarch64-linux-gnu.so       libbz2.so.1.0                         _multibytecodec.aarch64-linux-gnu.so
_codecs_iso2022.aarch64-linux-gnu.so  libcrypto.so.1.0.0                    readline.aarch64-linux-gnu.so
_codecs_jp.aarch64-linux-gnu.so       libpython2.7.so.1.0                   resource.aarch64-linux-gnu.so
_codecs_kr.aarch64-linux-gnu.so       libreadline.so.6                      test

$  dist/test/test   //ELF 실행 완료 
Jeonghun LEE
'1.10 1.06 1.03 1/554 11741\n'


  • spec 파일로 Package 생성 
위에서 Package 만드는것을 다시 반복한다면, 아래와 같이 spec파일로만 다시 실행

$ pyinstaller test.py
or  
$ ~/.local/bin/pyinstaller test.spec 
64 INFO: PyInstaller: 3.4
65 INFO: Python: 2.7.12
65 INFO: Platform: Linux-4.4.38-tegra-aarch64-with-Ubuntu-16.04-xenial
88 INFO: UPX is not available.
93 INFO: Extending PYTHONPATH with paths
['/home/nvidia/jhlee/pyinstall', '/home/nvidia/jhlee/pyinstall']
93 INFO: checking Analysis
100 INFO: Building because inputs changed
101 INFO: Initializing module dependency graph...
105 INFO: Initializing module graph hooks...
265 INFO: running Analysis Analysis-00.toc
369 INFO: Caching module hooks...
403 INFO: Analyzing test.py
3816 INFO: Loading module hooks...
3818 INFO: Loading module hook "hook-encodings.py"...
5360 INFO: Looking for ctypes DLLs
5360 INFO: Analyzing run-time hooks ...
5371 INFO: Looking for dynamic libraries
6439 INFO: Looking for eggs
6440 INFO: Python library not in binary dependencies. Doing additional searching...
6724 INFO: Using Python library /usr/lib/aarch64-linux-gnu/libpython2.7.so.1.0
6741 INFO: Warnings written to /home/nvidia/jhlee/pyinstall/build/test/warn-test.txt
6799 INFO: Graph cross-reference written to /home/nvidia/jhlee/pyinstall/build/test/xref-test.html
6908 INFO: checking PYZ
6918 INFO: checking PKG
6919 INFO: Bootloader /home/nvidia/.local/lib/python2.7/site-packages/PyInstaller/bootloader/Linux-64bit-aarch/run
6919 INFO: checking EXE
6921 INFO: checking COLLECT
WARNING: The output directory "/home/nvidia/jhlee/pyinstall/dist/test" and ALL ITS CONTENTS will be REMOVED! Continue? (y/n)y
12143 INFO: Removing dir /home/nvidia/jhlee/pyinstall/dist/test
12167 INFO: Building COLLECT COLLECT-00.toc
12214 INFO: Building COLLECT COLLECT-00.toc completed successfully. 



1.3 Spec 파일 수정 및 옵션 

상위에서 처럼 실행하면 spec파일은 자동으로 생성이 되며, 사용되는 옵션에따라 spec파일도 변경이 된다.

제대로 생성이 안되거나 동작이 안되면, WARNING 과  build/warn-xxxx 파일을 파악하여 분석하여 상위 옵션을 변경하거나, spec을 직접 수정하자.

PYTHONPATH  (-p)

pyinstaller setup.spec
    https://pythonhosted.org/PyInstaller/spec-files.html

2. pyinstaller 사용후 결론  

회사동료가 추천을 해주어 Python Project를  이 프로그램을 이용하여 쉽게 Package를 만들고, 이것이 ELF 포맷으로 동작되는 것을 보고,
Python의 Package가 완전 Compile되어 동작되는 줄 잠시 착각했다.

하지만 동작방식을 세부적으로 분석을 해 보면, Python을 Compile되는 방식이 아니라 ELF 포맷으로 맞춰주고 안에 구성을 Python library을 넣어
나머지 의 기본틀로 동작시켜 구동하는 구조이다.
(확인 방법은 간단하며, ELF Format을 간단히 분석을 해보면 된다 ldd 와 readelf )

결론적으로 Python의 성능상의 개선은 있겠지만, 다만 관련 Library를 한곳에 넣어 배포의 편이성 및 호환성에 맞추어 야 할 것 같다. 

나중에는 완전히 Library 형태로 Python의 종속을 벗어난 형태로 ELF 포맷으로 변경이 될지도 모르니
그때 다시 한번테스트를 한번해봐야 할 것 같다.

2/09/2019

Python OpenCV 예제들

1.  Python 기반으로 OpenCV 관련 예제 

Python을 가지고 OpenCV를  사용했을 때 참조했던 예제들이며, 예제구성과 설명이 너무 잘 되어있어 괜찮아서 이를 기반으로 구현 했으며, 많이 참조하였다.

필독 (readthedoc 기반구성)


  • Historgram 보기 및 Historgram Equalzation  
이때 나의 주의 관심사는 Histrogram과 Historgram Equalzation이였으며, 이를 쉽게 분석가능
  https://opencv-python.readthedocs.io/en/latest/doc/19.imageHistograms/imageHistograms.html#mask
  https://opencv-python.readthedocs.io/en/latest/doc/20.imageHistogramEqualization/imageHistogramEqualization.html

7/01/2018

python 자료정리 및 링크

1. Python 기본내용 

Python은 쉽게 배울수 있으며, 다양한 Library에 연결되어 사용되어지고 있어 테스트 용도 혹은 간단한 프로그램은 Python으로 쉽게 생성가능하다. 

아래의 내용은 Python 관련책의 예제내용 및 Python 사이트 참조 

  • 파이썬으로 배우는 알고리즘 트레이딩  
주식관련 Python 이며, 쉽게 Python 문법부터 설치를 배울 수 있어 너무 좋으며, PyQT기반으로 구성을 하여 증권사 Open API로 로그인하여 동작한다.
관심을 가지는 것은 주식으로 자동매매하는 프로그램 때문에 이 사이트에 관심을 많이 가졌다.
  https://wikidocs.net/2814

상위사이트는 대체적으로 Window 기반으로 설명을 하므로 Linux 기반에서 조금씩은 다른 것으로 보인다. 

  • The Hitchhiker Guide to python
외국서적으로 간단하게 Python에 대해 소개해주고 있음 
  https://python-guide-kr.readthedocs.io/ko/latest/

  • Python Index   
기본문법을 자세히 알려주기 때문에,  관련 함수 및 내용은 찾아보자.
그리고, 모르는 문법이나, 구조는 구글링을 하면, 대충 동작방식을 알수 있다.
  https://docs.python.org/ko/3/index.html

  • Python Tips

  • Python 3.x Tutorial  
Python의 기본 설명서로 상위 책처럼 각각의 예제가 있으므로 각 부분들을 보고 쉽게 익히자.
  https://docs.python.org/3.8/tutorial/index.html
  • Python 2.7 Tutorial  
  https://docs.python.org/2.7/

  • Python 관련정리자료 
  https://ahyuo79.blogspot.com/2016/06/python-and-django.html


1.1  Python 설치 및 기본문법 


  • Python의 Module 관련내용 
Module 생성 및 사용방법이며 추후 시간되며 나만의 모듈도 만들어보자 
  https://wikidocs.net/1074
  https://python-guide-kr.readthedocs.io/ko/latest/writing/structure.html#modules

  • Python 기본 제어 및 내장함수 
Python을 하다보면 매번 기본문법들이 조금씩 헷갈려서 보게되어진다.
  https://wikidocs.net/2864

  • Python의 기본자료구조

  • Python의 변수와 문자열
Python으로 작성하다보면, 항상 문자열과 변수사이의 변환 및 문자열 변환때문에 보게되어짐

  • Python 의 Class 생성방법
  https://book.pythontips.com/en/latest/classes.html


1.2 Python 의 Style Guide

기본문법과 설치 및 관련내용을 알아봤으니, Naming Convention 과 관련된 Code Convention 등을 알아보자.
  https://www.python.org/dev/peps/pep-0008/


2. Python 개발환경구성  

  • 개발환경에 관련된 내용을 아래에서 참고
vim/vscode/ecplise/pycharm 등 
  https://python-guide-kr.readthedocs.io/ko/latest/dev/env.html

Python을 개발하기 위해서 제공해주는 IDE Tool
  https://python-guide-kr.readthedocs.io/ko/latest/dev/env.html#ides


2.1  각 OS 별로 Package 지원 및 설치 

  • Linux (Ubuntu)
python을 제공해주고 있으며, 필요한 패키지를 pip or conda 별도로 설치를 진행하면 되겠다.
구지 Manual로 보면 아래 참조 

  • Window 
현재 나의 경우는 Window에서 사용할 일이 없기에 추후 관련자료만 링크
  https://python-guide-kr.readthedocs.io/ko/latest/starting/install/win.html

  • Python의 Package 관리 및 가상화   
Python에서 Package는 주로 보면 pip/pip3기반으로 주로 관리가 되어지며, conda로도 관리가 되어진다. 
pip기반으로는 venv로 가상환경을 만들고 conda 역시 virtuaenv를 만들기 때문에 둘다 같이 봐야한다.

Windw에서 conda 설치 

pip 와 virtualenv 설명 

python -m pip  install

virualenv (venv)


2.2 Python 와 C언어 확장 

  • PyPi 와 Cython 관련내용 
PyPi 와 Cython에대한 비교 및 관련내용 
  http://www.itworld.co.kr/news/122334

  • C/C++  Library 를 Python 연결확장 (Cython)
Python Extending 관련 및 관련함수 


Python 과 C의 실제 연결방법의 예제 

  • Cython 과 SWIG 
C/C++ Libaryr 기반의 Python 이며 상위 설명의 기술을 적용한 것

6/20/2016

GSTREAMER - PYTHON 예제분석 및 다양한 예제

1. Gstreamer Programing  

Gstreamer을  gst-launch로 pipeline으로 연결하여 실행도 가능하지만, Gstreamer을 C나 python을
이용하여 간단히 Programming이 가능하다. 이때 UBUNTU에서 GTK이 이용을 한다.

Gstreamer 관련설명 및 관련 C기반 예제 
  http://blog.daum.net/basetechnology/6998023

일반 Gstreamer 의 플러그들 
  https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/

지금 현재 GSTREAM로 PHYTHON을 지원하는 것은 UBUNTU에서 지원을 해준다.
  https://wiki.ubuntu.com/Novacut/GStreamer1.0#Using_GStreamer_1.0_from_Python


1.1  Gstreamer Python 준비

아래의 Python을 하기 위해서는 반드시 Python version 3이며, 아래와 같이 설치가 필요하다.


$ sudo apt-get install python-gi python3-gi \
    gstreamer1.0-tools \
    gir1.2-gstreamer-1.0 \
    gir1.2-gst-plugins-base-1.0 \
    gstreamer1.0-plugins-good \
    gstreamer1.0-plugins-ugly \
    gstreamer1.0-plugins-bad \
    gstreamer1.0-libav


처음 프로그래밍하기 전에 주의해야 할 사항은 다음과 같다.
1. python version 확인
2. 띄어쓰기 문제
3. #!/usr/bin/env python 문제


만약 Ubuntu를 사용한다면 Ubuntu version에따라 Gstreamer version이 지원이 다를수 있으니, 아래 사이트를 참고하자.
gstremer0.10 용 video player 와 gstreamer 1.0 용 video player는 다르다.
(video player 각 예제가 ubuntu에서 동작되는 것을 기본적으로 확인했음)

  https://wiki.ubuntu.com/Novacut/GStreamer1.0#Adding_PPA_for_Ubuntu_Precise


1.2 Python 관련기본자료 


  • Python 관련 기본설명 
  https://ahyuo79.blogspot.com/2016/06/python-and-django.html

  • GSTREAMER-PYTHON TUTORIAL 
  http://brettviren.github.io/pygst-tutorial-org/pygst-tutorial.pdf

  • Gst-1.0  (Function 과 Hierarchy 로 구조파악)
  https://lazka.github.io/pgi-docs/#Gst-1.0

  • Python GOBJECT
  https://pygobject.readthedocs.io/en/latest/

  • Python GTK
  https://python-gtk-3-tutorial.readthedocs.io/en/latest/


솔직히 Python Gstreamer은 gst-lanuch을 다룬다면, 프로그래밍을 하기가 쉬운거 같다.
아래와 같이 시작 매뉴얼을 익히고, 기본 GTK 이나, QT에 연결하여 하면 되는 것 같다.
다만 문제가 최종동작이 되는지는 보장이 되는지는 모르겠다.


gst-lanuch와 동일하게 Gst.ElementFactory.make() 에 PlugIns의 Element의 정보를 넣으면 된다.

Gstreamer 관련 사항은 Tutorial 에 나와 있지만, 관련사항을 다음과 같이 정리한다.

  1. Pipeline을 우선 만들고, 
  2. add로 추가한다
  3. link로 연결한다.
  4. connect 는 일종의 call back function이다.

manual의 4.3 connection에서 event와 bus 부분을 보면 쉽게 개념을 잘 이해 할 수 있다.
일종의 Timing 맞추기 위해서 사용한다고 보면된다.

아래의 상태는 Gstreamer의 상태를 말하며, pipeline의 상태를 말한다.

Gst.State.PAUSE
Gst.State.PLAYING


GTK관련 Example Manual 보면 Gst.parse_launch 있는데, 사용법이 독특하다.
사용하기도 편한데 아직 다뤄보지 못했다.


1.3  Python Gstremer ex-1

아래의 예제는 위의 pygst-tutorial-org/pygst-tutorial.pdf에서 가져온것이며,실제로 실행본 것이 아니다.
하지만 대충 보면 쉽게 이해가기 때문에 일단 정리한다. 

#!/usr/bin/env python
import os
import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GObject, Gtk

### GTK Main Class로 구성 및 이기반으로 실행 
class GTK_Main(object):
     
   def __init__(self):
          window = Gtk.Window(Gtk.WindowType.TOPLEVEL)
          window.set_title("Mpeg2-Player")
          window.set_default_size(500, 400)
          window.connect("destroy", Gtk.main_quit, "WM destroy")
          vbox = Gtk.VBox()
          window.add(vbox)
          hbox = Gtk.HBox()
          vbox.pack_start(hbox, False, False, 0)
          self.entry = Gtk.Entry()
          hbox.add(self.entry)
          self.button = Gtk.Button("Start")
          hbox.pack_start(self.button, False, False, 0)
          self.button.connect("clicked", self.start_stop)
          self.movie_window = Gtk.DrawingArea()
          vbox.add(self.movie_window)
          window.show_all()

          self.player = Gst.Pipeline.new("player")
          source = Gst.ElementFactory.make("filesrc", "file-source")
          demuxer = Gst.ElementFactory.make("mpegpsdemux", "demuxer")
          demuxer.connect("pad-added", self.demuxer_callback)      # callback function 
          self.video_decoder = Gst.ElementFactory.make("mpeg2dec", "video-decoder")
          self.audio_decoder = Gst.ElementFactory.make("mad", "audio-decoder")
          audioconv = Gst.ElementFactory.make("audioconvert", "converter")
          audiosink = Gst.ElementFactory.make("autoaudiosink", "audio-output")
          videosink = Gst.ElementFactory.make("autovideosink", "video-output")
          self.queuea = Gst.ElementFactory.make("queue", "queuea")
          self.queuev = Gst.ElementFactory.make("queue", "queuev")
          colorspace = Gst.ElementFactory.make("videoconvert", "colorspace")

####pipleline 추가 

          self.player.add(source)
          self.player.add(demuxer)
          self.player.add(self.video_decoder)
          self.player.add(self.audio_decoder)
          self.player.add(audioconv)
          self.player.add(audiosink)
          self.player.add(videosink)
          self.player.add(self.queuea)
          self.player.add(self.queuev)
          self.player.add(colorspace)


          source.link(demuxer)


          self.queuev.link(self.video_decoder)
          self.video_decoder.link(colorspace)
          colorspace.link(videosink)

          self.queuea.link(self.audio_decoder)
          self.audio_decoder.link(audioconv)
          audioconv.link(audiosink)

          bus = self.player.get_bus()
          bus.add_signal_watch()
          bus.enable_sync_message_emission()
          bus.connect("message", self.on_message)
          bus.connect("sync-message::element", self.on_sync_message)


   def start_stop(self, w):

      if self.button.get_label() == "Start":
            filepath = self.entry.get_text().strip()
            if os.path.isfile(filepath):
                 filepath = os.path.realpath(filepath)
                 self.button.set_label("Stop")
                 self.player.get_by_name("file-source").set_property("location", filepath)
                 self.player.set_state(Gst.State.PLAYING)
            else:
                 self.player.set_state(Gst.State.NULL)
                 self.button.set_label("Start")


   def on_message(self, bus, message):
      t = message.type
      if t == Gst.MessageType.EOS:
            self.player.set_state(Gst.State.NULL)
            self.button.set_label("Start")
      elif t == Gst.MessageType.ERROR:
            err, debug = message.parse_error()
            print "Error: %s" % err, debug
            self.player.set_state(Gst.State.NULL)
            self.button.set_label("Start")

   def on_sync_message(self, bus, message):
      if message.get_structure().get_name() == 'prepare-window-handle':
            imagesink = message.src
            imagesink.set_property("force-aspect-ratio", True)
            xid = self.movie_window.get_property('window').get_xid()
            imagesink.set_window_handle(xid)

   def demuxer_callback(self, demuxer, pad):
      if pad.get_property("template").name_template == "video_%02d":
            qv_pad = self.queuev.get_pad("sink")
            pad.link(qv_pad)
      elif pad.get_property("template").name_template == "audio_%02d":
           qa_pad = self.queuea.get_pad("sink")
           pad.link(qa_pad)
####

#### Main Call 
Gst.init(None)
GTK_Main()
GObject.threads_init()
Gtk.main()


1.4  Python simple example 수정방법

아래의 example은 video-player-1.0을 기반으로 돌아가는 video-player를 rtsp용으로 본인이 변경한 것이다.
이전에 다른회사에서 요청이 와서 관련부분들을 고쳤는데, 간단한 것만 정리한다. 

Jeston TK1/TX1 기반으로 작성한 것이므로, 일반 Ubuntu에서는 동작이 되지 않는다.
아래와 같이 Jeston TK1/TX1에서 gstreamer로 확인한 후, phython으로 아래와 같이 변경하였다.

$ gst-launch-1.0 -v rtspsrc location=rtsp://192.168.1.168:8557/PSIA/Streaming/channels/2?videoCodecType=H.264 caps="video/x-h264,mapping=/video " \
! rtph264depay ! h264parse  ! omxh264dec ! nveglglessink -e


main은 p = Player()  p.run() 이며 아래소스와 상위 command 를 보면 대충  쉽게 이해가며 각 필요한 부분들은 자신에 맞게 수정하도록하자 
나의 경우는 각 Jetson에 맞게 수정하였으며, 각 Jetson의 Manual을 참조해야함 

#!/usr/bin/python3
# http://bazaar.launchpad.net/~jderose/+junk/gst-examples/view/head:/video-player-1.0

from os import path

import gi
gi.require_version('Gst', '1.0')
from gi.repository import GObject, Gst, Gtk

# Needed for window.get_xid(), xvimagesink.set_window_handle(), respectively:
from gi.repository import GdkX11, GstVideo

GObject.threads_init()
Gst.init(None)

WORKAROUND_SLEEP_SEC = 0.5
#WORKAROUND_SLEEP_SEC = 0.0

class Player(object):
    def __init__(self):
        self.window = Gtk.Window()
        self.window.connect('destroy', self.quit)
        self.window.set_default_size(800, 450)

        self.drawingarea = Gtk.DrawingArea()
        self.window.add(self.drawingarea)

        # Create GStreamer pipeline
        self.pipeline = Gst.Pipeline()

        # Create bus to get events from GStreamer pipeline
        self.bus = self.pipeline.get_bus()
        self.bus.add_signal_watch()
        self.bus.connect('message::eos', self.on_eos)
        self.bus.connect('message::error', self.on_error)

        # This is needed to make the video output in our DrawingArea:
        self.bus.enable_sync_message_emission()
        self.bus.connect('sync-message::element', self.on_sync_message)

# 상위와 같이 RTSP기반으로 Gst make 및 property 설정 
        videosource = Gst.ElementFactory.make('rtspsrc', 'videosource')
        videosource.set_property('location', 'rtsp://192.168.1.168:8557/PSIA/Streaming/channels/2?videoCodecType=H.264')
        videosource.set_property('latency', 500)
       #videoqueue = Gst.ElementFactory.make('queue', 'videoqueue')
        videodepay = Gst.ElementFactory.make('rtph264depay', 'videodepay')
        videoparser = Gst.ElementFactory.make('h264parse', 'videoparser')
        videodecoder = Gst.ElementFactory.make('omxh264dec', 'videodecoder')

        #filesink = Gst.ElementFactory.make('filesink', 'sink')
        #filesink.set_property('location', r'/home/ubuntu/Downloads/N/test11.mp4')
        #filesink.set_property('sync', 'false')

        videosink = Gst.ElementFactory.make('nveglglessink', 'videosink')
        videosink.set_property('create-window', False)


        #self.player.add(videosource, videoqueue, videodepay, videoparser,videodecoder,videosink)
        #Gst.element_link_many(videosource, videoqueue, videodepay, videoparser,videodecoder,videosink)

### Callback Functions 등록 변경 및 테스트할 경우   
        videosource.connect("pad-added", self.videosource_pad_added)
       # videodepay.connect("pad-added", self.test2_pad_added)
       # videoparser.connect("pad-added", self.test3_pad_added)
       # videodecoder.connect("pad-added", self.videodecoder_pad_added)

### Pipeline self.pipeline.add(videosource) #self.pipeline.add(videoqueue) self.pipeline.add(videodepay) self.pipeline.add(videoparser) self.pipeline.add(videodecoder) self.pipeline.add(videosink) #self.pipelie.add(filesink) ### TEST Callback 과 필요 Callback Functions 추가하며 필요시 디버깅 및 상위에서 등록 def test1_pad_added(self, dbin, pad): print('jhlee-debugmsg connected test1_pad_added!!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!') def test2_pad_added(self, dbin, pad): print('jhlee-debugmsg connected test2_pad_added!!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!') def test3_pad_added(self, dbin, pad): print('jhlee-debugmsg connected test3_pad_added!!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!') def test4_pad_added(self, dbin, pad): print('jhlee-debugmsg connected test4_pad_added!!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!') def videosource_pad_added(self, dbin, pad): print('jhlee-debugmsg connected videosource_pad_added start') #####videosource.link(videodepay) 각 부분 디버깅 pipeline = dbin.get_parent() videodepay = pipeline.get_by_name('videodepay') dbin.link(videodepay) #####videodepay.link(videoparser) videoparser = pipeline.get_by_name('videoparser') videodepay.link(videoparser) ######videoparser.link(videodecoder) videodecoder = pipeline.get_by_name('videodecoder') videoparser.link(videodecoder) videosink = pipeline.get_by_name('videosink') videodecoder.link(videosink) #### PIPELINE STATE 변경 pipeline.set_state(Gst.State.PLAYING) if (WORKAROUND_SLEEP_SEC > 0): sleep(WORKAROUND_SLEEP_SEC) print('jhlee-debugmsg connected videosource_pad_added end') def videodepay_pad_added(self, dbin, pad): print('jhlee-debugmsg connected videodepay_pad_added start') def videodecoder_pad_added(self, dbin, pad): print('jhlee-debugmsg connected videodecoder_pad_added start') pipeline = dbin.get_parent() videosink = pipeline.get_by_name('videosink') # Link decodebin to video sink dbin.link(videosink) pipeline.set_state(Gst.State.PLAYING) // PIPELINE STATE 변경 if (WORKAROUND_SLEEP_SEC > 0): sleep(WORKAROUND_SLEEP_SEC) print('jhlee-debugmsg connected videodecoder_pad_added end') def run(self): self.window.show_all() # You need to get the XID after window.show_all(). You shouldn't get it # in the on_sync_message() handler because threading issues will cause # segfaults there. self.xid = self.drawingarea.get_property('window').get_xid() self.pipeline.set_state(Gst.State.PLAYING) Gtk.main() def quit(self, window): self.pipeline.set_state(Gst.State.NULL) Gtk.main_quit() def on_sync_message(self, bus, msg): if msg.get_structure().get_name() == 'prepare-window-handle': print('prepare-window-handle') msg.src.set_window_handle(self.xid) def on_eos(self, bus, msg): print('on_eos(): seeking to start of video') self.pipeline.seek_simple( Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT, 0 ) def on_error(self, bus, msg): print('on_error():', msg.parse_error()) p = Player() p.run()


1.5 Python 의 API 관련 설명 

솔직히 상위 Python은 Python3를 이해하고, Gstreamer를 이해하며 눈짐작으로 대충은 이해하지만 정확한 이해는 하지 못한다.
아래의 각각의 GTK or Gstreamer의 API를 정확히 어떻게 동작하는 지를 그 함수들의 API 설명해주는 곳이 
아래 SITE이며 , 이곳에서 각각의 함수의 동작을 알아보자.

  https://lazka.github.io/pgi-docs/


1.6  Python 관련 Open Source 

python의 opensource를 보다보니, repo source도 좋은 예제인 것 같다.

  • QT Example
  https://wiki.python.org/moin/PyQt/Using%20GStreamer%20with%20PyQt
  http://www.jonobacon.org/2006/08/28/getting-started-with-gstreamer-with-python/

  • Gstreamer 일반다른예제들 (아래 예제포함)
  http://bazaar.launchpad.net/~jderose/+junk/gst-examples/files/79

  • Video Player (상위예제)
기본적으로 ubuntu에서 동작이 되는것을 확인했으며, 본인의 것에 따라 수정을 해줘야한다.
  http://bazaar.launchpad.net/~jderose/+junk/gst-examples/view/head:/video-player-1.0

  • Webcam 예제 
  http://bazaar.launchpad.net/~jderose/+junk/gst-examples/view/head:/webcam-0.10
  https://storage.googleapis.com/git-repo-downloads/repo

  • NVIDIA의 JETSON 의 RTSP 작업 오픈소스에 반영
이전에 다른회사에서 개발의뢰가 들어와서 이기반으로 소스를 수정하여 다른 회사의 RTSP 문제를 해결 해주었다. (적은돈이 아니라 기쁘다) 
mulitmedia.py 기반으로 multimedia-rtsp.py 새로 만들어 아래에 내가 반영했으며, Open Source라서 회사에는 크게 문제는 상관이 없다.