[Pyinstaller] Bootloader compile

Python(pyqt5) 기반의 GUI Tool을 만들어서 사용할 때 pyinstaller로 생성한 exe 파일 다운로드 또는 실행 시 백신에 걸리는 문제가 종종 발생한다.

이 문제에 대한 해결책을 검색하던 중 pyinstaller bootloader를 환경에 맞게 컴파일하여 사용하는 방법이 있다고 해서 시도해 봤다.

이 방법을 시도하기 전에 인증서를 사용해 디지털 서명을 추가하는 방법을 사용해서 약간 효과를 봤었다. (예: Windows 환경의 특정 백신으로 인해 삭제되던 exe 파일이 서명 추가 후 삭제되지 않음)

이는 다음 글에서 정리하도록 한다.

Pyinstaller는 version 3.5를 사용하다가 얼마 전 3.6 version이 릴리즈 되어 업데이트 후 사용 중이다.


환경

  • Windows 10 64bit
  • Python 3.7.4

참고로 pip를 사용해서 pyinstaller를 설치한 경우, bootloader 이미지는 있으나 소스 코드는 포함되어 있지 않다고 한다.

pyinstaller 패키지가 설치된 경로로 들어가 보면 bootloader 디렉터리의 이미지들이 환경 별로 나누어져 있는 것을 볼 수 있다.

$ pwd
/c/Python37-32/Lib/site-packages/PyInstaller/bootloader

$ ls -al
total 12
drwxr-xr-x 1 Administrator 197121 0  2월 12 09:38 ./
drwxr-xr-x 1 Administrator 197121 0  1월 29 11:20 ../
drwxr-xr-x 1 Administrator 197121 0  1월 29 11:20 Darwin-64bit/
drwxr-xr-x 1 Administrator 197121 0  1월 29 11:20 images/
drwxr-xr-x 1 Administrator 197121 0  1월 29 11:20 Linux-32bit/
drwxr-xr-x 1 Administrator 197121 0  1월 29 11:20 Linux-64bit/
drwxr-xr-x 1 Administrator 197121 0  1월 29 11:20 Windows-32bit/
drwxr-xr-x 1 Administrator 197121 0  1월 29 11:20 Windows-64bit/

$ ls -al Windows-64bit/
total 1084
drwxr-xr-x 1 Administrator 197121      0  1월 29 11:20 ./
drwxr-xr-x 1 Administrator 197121      0  2월 12 09:38 ../
-rwxr-xr-x 1 Administrator 197121 274432  1월 29 11:20 run.exe*
-rwxr-xr-x 1 Administrator 197121 278016  1월 29 11:20 run_d.exe*
-rwxr-xr-x 1 Administrator 197121 273408  1월 29 11:20 runw.exe*
-rwxr-xr-x 1 Administrator 197121 278016  1월 29 11:20 runw_d.exe*

Build and install

Download source package

아래 링크에서 릴리즈 버전 별로 소스 코드를 다운로드 할 수 있다.

또는, git clone을 사용하여 최신 개발 버전 또는 원하는 commit 버전을 받아올 수 있다.

git clone https://github.com/pyinstaller/pyinstaller

여기에서는 git clone을 이용해서 최신 커밋 버전을 다운로드 했다.

Build

cd pyinstaller/bootloader
python ./waf distclean all

(Log)

'distclean' finished successfully (0.072s)
'all' finished successfully (0.001s)
'distclean' finished successfully (0.001s)
...
[21/21] Linking build\releasew\runw.exe
...

'install_releasew' finished successfully (0.148s)

Install

cd ..
python setup.py install

(Log)

running install
running bdist_egg
running egg_info
writing PyInstaller.egg-info\PKG-INFO
writing dependency_links to PyInstaller.egg-info\dependency_links.txt
writing entry points to PyInstaller.egg-info\entry_points.txt
writing requirements to PyInstaller.egg-info\requires.txt
writing top-level names to PyInstaller.egg-info\top_level.txt
reading manifest file 'PyInstaller.egg-info\SOURCES.txt'
reading manifest template 'MANIFEST.in'
...
Using c:\python37-32\lib\site-packages
Searching for future==0.17.1
Best match: future 0.17.1
Adding future 0.17.1 to easy-install.pth file
Installing futurize-script.py script to C:\Python37-32\Scripts
Installing futurize.exe script to C:\Python37-32\Scripts
Installing futurize.exe.manifest script to C:\Python37-32\Scripts
Installing pasteurize-script.py script to C:\Python37-32\Scripts
Installing pasteurize.exe script to C:\Python37-32\Scripts
Installing pasteurize.exe.manifest script to C:\Python37-32\Scripts

Using c:\python37-32\lib\site-packages
Finished processing dependencies for PyInstaller==4.0.dev0+ga1f92c6a.mod

pyinstaller 디렉토리 내 setup.py 파일을 사용하여 설치 까지 완료했다.


동작 확인

pyinstaller 버전 확인

직접 빌드 후 설지한 버전을 확인하니 아래와 같이 나온다.

$ pyinstaller -v
4.0.dev0+ga1f92c6a.mod

그리고 동일한 python 코드를 사용하여 exe 파일 생성 후, 확인해 봤는데 큰 차이는 알 수 없었다.

(Virus total 사이트에 exe 파일 업로드 후 결과를 확인해봤을 때 같은 결과가 나왔다.)

EXE 파일에 대한 테스트 방법에 대해서도 정리해 봐야겠다.


참조 링크

[Linux Kernel] Updates Related to WIZnet W5500

Linux kernel

While searching for the WIZnet W5500 linux driver, I noticed a W5500 update in the linux kernel github repository.

Entering through the commit ID seems to have been updated since v5.2-rc3.

The commit comment is shown below, and the description shows that the device tree of w5x00 is supported.

net: ethernet: wiznet: w5X00 add device tree support

The w5X00 chip provides an SPI to Ethernet inteface. This patch allows
platform devices to be defined through the device tree.
...

As the device tree support was added, the following document files were added.

The above file is a guide for writing DTS. It consists of descriptions and basic examples of property values to use W5x00.

If you want to use the W5500 in a Linux environment, this is a good reference.


Raspberry Pi kernel

The kernel of Raspberry Pi is applied to the rpi-5.3.y branch. (There is no devicetree doc file in 5.2.y.)

[RaspberryPi] Hash Sum mismatch 에러

Hash Sum mismatch 문제 발생

라즈베리파이를 사용할 일이 있어 최신 버전의 Rasbian을 설치했다. (2019-04-08-raspbian-stretch)

초기 설정 시 패키지 업데이트를 위해 apt-get update를 수행하는데, 자꾸 아래와 같은 에러가 발생하면서 정상 수행이 되지 않았다.

  • 추가: apt-get update는 잘 수행되더라도 apt-get upgrade에서 문제가 발생할 수도 있다.
Hit:1 http://archive.raspberrypi.org/debian stretch InRelease
Get:2 http://mirrordirector.raspbian.org/raspbian stretch InRelease [15.0 kB]
Get:3 http://mirrordirector.raspbian.org/raspbian stretch/main armhf Packages [11.7 MB]
Err:3 http://mirrordirector.raspbian.org/raspbian stretch/main armhf Packages
  Hash Sum mismatch
  Hashes of expected file:
   - Filesize:11663116 [weak]
   - SHA256:dd920dbf4c20fb028a317ddd49b7c69b63d1e241e8bf51655f53f1c813772dc5
   - SHA1:6ddbe51cc9206a408cd479bd9a5c2e1e0ba98aee [weak]
   - MD5Sum:fe39fba2eddc33956d37b6a5c42f11ea [weak]
  Hashes of received file:
   - SHA256:44db7d86347ab0171b6e42506d07984c06ffcc57d3582a192ac08a989012b898
   - SHA1:cb6c1ab651449f437b7ec5d32fb469058c5c4db1 [weak]
   - MD5Sum:db0b7d2fd433fde31459c4d799b11bba [weak]
   - Filesize:11387934 [weak]
  Last modification reported: Wed, 19 Jun 2019 04:27:53 +0000
  Release file created at: Thu, 20 Jun 2019 22:29:14 +0000
...
...

Hash Sum mismatch 라는 문구가 눈에 띄어 검색해보니 내용이 많이 나오는데, 해결 방법은 바로 찾지 못해서 시간이 좀 걸렸다.


해결 방법

해결 방법은 Raspbian mirror 링크를 변경해 주는 것이다.

Raspbian Mirror

먼저 아래 링크에 접속해서 변경할 새 mirror 링크를 찾는다. 링크는 지역 별로 있어서 적절히 가까운 지역으로 선택하면 되는 듯하다. 나는 South Korea 지역 링크 중 하나를 선택했다.


Mirror 링크 변경

라즈베리파이에 접속해서 mirror 링크를 새 링크로 변경해 준다.

설정 파일의 기존 라인을 복사한 다음 주석처리 하고, 링크 부분만 변경해 주었다.

http://raspbian.raspberrypi.org/raspbian/  ==>  http://mirror.premi.st/raspbian/raspbian/
$ sudo vi /etc/apt/sources.list

#deb http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi
deb http://mirror.premi.st/raspbian/raspbian/ stretch main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'

설정 저장 후 reboot.

다시 apt-get update 명령을 수행하니 잘 된다.


Reference