python 각종 팁

python도 문법이 난잡하고 예쁘지 않아서 안배우고 싶었지만, 이만큼 강력한 스크립트 언어도 없다 생각된다. ruby가 예뻐서 좋은데, 범용성이 떨어지고 라이브러리도 약해서… python주변을 얼쩡거리게 된다.

파이썬 실행파일 만들기
파이썬3 실행파일 만들기

http://www.pyinstaller.org/

 

pip로 설치시 SSL 사용 안하기

Anaconda에서 SSL 사용 안하기

 

 

http://thecoollife.tistory.com/704

https://rein.kr/blog/archives/2444

 

http tunnel 제작하기

개인적으로 인터넷 환경이 열악하여 부득이하게 http tunnel이 필요하게 되었다. 그런데, 이와같은 기능을 필요로 하는 사람이 적은지 툴들이 많이 개발되어 있지 않다.
이왕 필요한거 python공부도 할겸 이걸로 만들어보기로 했다. 한 2001년 정도에 C++로 IOCP를 이용해서 상용 서버를 만들어봤기때문에 개념은 충만하다. 다만, 각개전투력이 낮아서 걱정.

기본적인 접근

일반적으로 클라이언트에서 서버로 접속하는 과정은 위의 1과 3의 과정이 하나로 연결되어 진행된다. 이 과정에서 가운데 있는 두개의 박스가 관여하게 된다.

HTTP Tunnel Client(HTC)는 소켓 서버와 HTTP Client로 구성되고 HTTP Tunnel Server(HTS)는  HTTP 서버와 소켓 클라이언트로 구성된다.

소스는 https://bitbucket.org/smilemango/http-data-band 에서 관리한다.

각개전투

기본적인 접근은 쉬우나 python에 대해서 익숙하지 않은지라, 게다가 socket프로그래밍도 손놓은지 오래가 사소한 것에서 부딪히게 되었다.

단일쓰레드 방식의 HTTPServer

파이썬에 내장된 HTTPServer는 기본적으로 싱글 쓰레드로 동작한다. 따라서, 동시 요청이 있을 경우 순차적으로 처리한다. 이게 문제가 되는게 내가 원하는 HTTP서버는 Request와 Response모두 대기 상태가 되어야하는데, 둘 중 하나만 처리가 가능한 상황이기 때문이다. 다행스럽게도 아래 코드 하나로 멀티쓰레드로 동작한다. 다만 요청이 올때마다 새로운 쓰레드를 만들어서 처리하는 방식으로 보이므로 추후 성능 개선의 포인트가 될 수 있을 것 같다.

 

HTTPServer 종료하기

터미널에서 실행시킬땐 문제 없지만, GUI로 동작시키기 때문에 Ctrl-C가 안먹는다. 따라서 종료를 따로 시켜줘야하는데, 별도의 쓰레드에서 httpd.shutdown()을 실행해주면 된다.

실행파일(exe) 만들기

실행파일로 만들어서 배포하는데 있어서, cx_freeze라는 녀석을 이용해서 PyQT5로 만든 심플한 대화상자를 실행파일로 만들었는데 무려 200MB다. 각종 패키지가 다 꾸겨넣어져서 그런것 같다. 다행스럽게도 pyinstaller라는 녀석을 이용하면 40MB안쪽으로 가능하다. 요즘 세상에 40MB면… 음, 그래도 크긴 하지만 감당 가능한 수준인것 같다. 이순간부터 cx_freeze는 버리고 pyinstaller로 간다. 제일 가벼워보이는 (TkInter로 하려고 했는데, exe로 바꿔서 실행하면 환경변수 어쩌고 저쩌고 에러나길래 귀찮아서 포기함)

실행파일의 아이콘 바꾸기

 

프로그램 실행되는 위치 구하기

python 스크립트로 실행할 경우와 exe로 만들어 실행할 경우 현재 위치를 구하는 방법이 다르다. 따라서, 아래와 같이 코딩해야한다.

 

트레이 아이콘 만들기

 

태스크바에서 아이콘 숨기기

메인 다이얼로그를 실행할때 부모를 QWidget으로 설정해주면 태스크바에서 사라진다. 아마도 기본적으로 최초 실행프로그램은 부모가 Taskbar가 아닐까 싶다. 부모 없이 만들어 주면 사라지는게 아닐까?

설치 스크립트 작성하기

설치 스크립트는 뭘 써야 좋은지 모르겠지만, Inno Setup으로 하기로 했다. alternativeTo에서 가장 높은 평가를 받았다. ㅋㅋ

 

git 이용시 SSL을 사용하지 않기

우리 회사는 강려크한 네트워크 보안 시스템을 운용중이라서 https 이용중 인증서를 가로채서 변조한다. 아마도 변조한 인증서를 이용하여 내가 무슨 데이터를 보고 있는지 알고 싶은것 같다. 여튼 이런 관계로 웬만한 오픈소스 툴이나 서비스를 이용하는데 애로사항이 꽃핀다.

bitbucket에서도 https를 이용할때 이로 인해 에러가 발생한다.

이 경우 일단은 SSL을 사용하지 않고, 소스를 clone한 뒤에, 소스 폴더 내에서 SSL을 사용하지 않도록 설정하면 된다. 아래와 같이