PyQt에 firestore 연결하고 exe 파일로 만들기 (2)

Computer 비관심/PyQt5|2019. 9. 14. 01:11
반응형

파이어베이스와 PYQT의 조화는 잘 사용하지 않는지 자료가 그다지 많지 않았다.

디버깅 하는 스스로 만들어내고 PYQT와 FIREBASE에서 발생하는 버그의 해결책들을 찾는데 시간이 오래걸렸다.

 

 

PyQ에 firestore연결하고 exe 파일 만들기- 파이어스토어 파이썬에 연동하는법(1)

https://infocentre.tistory.com/45 

 

 

1. 파이인스톨러 사용

 

(1) 파이인스톨러(pyinstaller)를 사용한다. 

- 파이인스톨러의 간단한 사용 방법은 이전 글에 적어 두었다. 

https://infocentre.tistory.com/3

 

2. 디버깅 (디버깅을 쉽게 하는 방법을 모르면 개고생합니다.)

 

(1). 파일인스톨러를 사용할때 디버깅을 위해서 처음엔 -w 플레그를 붙이지 않고 실행 파일을 만든다.

-w 플래그를 붙이면 console창이 나오지 않아서 어떤 버그가 발생했는지 알기 힘들다. 이렇게 해야 하는 이유는 잘 동작하던 파이썬 큐티프로그램이 exe파일로 만들면 실행이 안되는 경우가 있기 때문이다.

 

(2)try except 구문을 잘 이용한다. 

try:
	#실행할 코드 넣기~
    
except Exception as e: 
	print(e) #에러를 표시하기 위해서
	input() #멈추게 하기 위해서

 

이 구문은 app.exec_() 이전에 써 넣어야 디버깅 화면이 꺼지지 않는다.

 

3. 이렇게 해서 디버깅을 해보면 The 'google-cloud-firestore' distribution was not found and is required by the application 라는 에러가 나온다.

 

- 파이썬 인스톨러가 구글클라우드 파이어베이스 스토어를 실행 시키지 않는것이다. 그래서 훅을 만들어준다.

\Lib\site-packages\PyInstaller\hooks 에 들어가서 hook-google.cloud.py 파일에 아래 코드를 추가해준다.

 

datas += copy_metadata('google-cloud-firestore')

 

 

4. 그리고 다시 실행해보면 잘 되거나 아니면 이런 버그가 발생한다.

Exception ignored in: 'grpc._cython.cygrpc.ssl_roots_override_callback'
E0913 23:26:43.750000000  9436 src/core/lib/security/security_connector/ssl_utils.cc:448] assertion failed: pem_root_certs != nullptr

 

이번엔 hooks폴더에  hook-grpc.py를 만들고 아래와 같은 코드를 넣는다.

 

from PyInstaller.utils.hooks import collect_data_files

datas = collect_data_files('grpc')

 

작동한다! 

 

참조: https://stackoverflow.com/questions/55848884/google-cloud-firestore-distribution-doesnt-get-added-to-pyinstaller-build

 

5. pyqt5 5.13 버전과 파이인스톨러를 같이 사용할 경우 다른 컴퓨터로 옮겼을때 작동이 안될 수 있다.

에러 - ImportError: unable to find Qt5Core.dll on PATH

- 이 경우 가장 쉬운 해결 방법은 이전 버전으로 다운그레이드 하는 것이다.

pip install pyqt5==5.12.2

 

참조 : https://stackoverflow.com/questions/56949297/how-to-fix-importerror-unable-to-find-qt5core-dll-on-path-after-pyinstaller-b

 

 

 

 

 

 

 

 

댓글()

[프로그램 분석]시작프로그램에 등록

Computer 관심/이것저것|2018. 12. 19. 11:13
반응형

윈도우에서 시작프로그램으로 등록시키는 방법은 두 가지가 있다.


cmd + R을 클릭 한뒤 shell:startup이라고 적고 시작할 프로그램을 넣는 방법과

시작프로그램 레지스트리를 넣는 방법이다.


바탕화면 정리 어플인 니미플레이스를 삭제하고 싶었다. 하지만 제어판에서 삭제를 할 수 없었고 설치된 위치의 폴더 삭제를 시도하였다.

하지만 니미플레이스는 컴퓨터가 시작할때 자동으로 시작 되지 않는가?


그렇다면 시작프로그램에서 제거를 해야한다.

CTR + ART + DEL를 눌러본다.

작업관리자를 클릭한다.

시작프로그램을 클릭한다.


니미플레이스가 보인다.


"제거 하는게 없다! 중지만 있다!"

cmd + R을 클릭 한뒤 shell:startup을 쳐본다.

스타트업 폴더가 비어있다.


이제 남아있는 곳은 단 한군대 밖에 없다. "레지스트리!" 분명 여기에 있을 것이다.


 https://gbworld.tistory.com/1296


여기 블로그에서 레지스트리가 보통 등록되는 장소를 찾았다.

과연 여기에 있을까?


HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run


"찾았다."


여기를 보니 니미플레이스 뿐만이 아니라 카카오톡까지 등록 되어있는 것을 볼 수 있었다.


일단 정말 여기에 등록되면 자동으로 실행이 되는것인가? 지우고 컴퓨터를 껐다 켜본다.


자동으로 실행이 안된다. "실행할때마다 레지시트리를 등록시키는 것인가?" 이번에는 니미플레이스를 실행해보고 다시 껐다 켜본다. 그래도 시작이 안된다.

이말은 즉 이 프로그램은 인스톨시에 딱 한번 레지스트리에 등록을 시킨다는 의미이다. 


"그럼 프로그램을 만들때 윈도우에 레지스트리를 등록 시키면 자동으로 실행이 되겠군"


파이썬에 윈도우 레지스트리에 write하는 모듈이 있나 찾아본다. "_winreg라고 있다"


https://www.blog.pythonlibrary.org/2010/03/20/pythons-_winreg-editing-the-windows-registry/


이제 시작프로그램에 등록 할 수있다!! 끗

댓글()

[requests.post] python으로 보낸 데이터 php로 받기

카테고리 없음|2017. 2. 11. 00:41
반응형

python으로 보낸 데이터 php로 받기



인터넷에서 python에서 데이타를 보내는 예제를 많이 찾아 볼 수 있다. 하지만 문제는 파이썬3.x버전에서는 사용해야 하는 모듈이 인터넷에 나온 기존 예제와 다르다는 것이다. 또한 데이타베이스에 저장을 하는 것이 아닌 쿠키를 생성함으로써 데이타가 잘 전송되는지 알아보려고 하는 실수 때문에 시간이 오래 걸렸다.


작동되는 코드는 다음과 같이 간단하다.



import requests

userdata = {"firstname": 'frompython', "lastname": "Doe", "password": "jdoe123"}

resp = requests.post('http://localhost/test/testing.php', data=userdata)

print(resp.text)

 





1. 딕셔너리 형식으로 데이타를 변수에 저장한 뒤 

2. requests.post를 사용하여 데이타를 처리하는 페이지에 전달을 한다.

다음은 이것을 처리하는 php서버 코드이다.


<?php 

if(isset($_POST['firstname'])){

   $name = $_POST['firstname'];

   $conn=mysql_connect("localhost","root","");

   if(!$conn){

   die('could not connect:'.mysql_error());

   }

   mysql_select_db("test",$conn);

   $query ="INSERT INTO testing (data) VALUES ('$name');";  

   // '$name에서' '' 이거 빠뜨리지 않게 조심해야함. 쿠키는 클라이언트에서 생성함으로 여기서 만들어지지 않음


   $result = mysql_query($query, $conn);  

   setcookie("name", "$name", time()+5000);

   echo "$name";

}else{

   echo("nothing");

}


 ?>



처음에 데이타가 제대로 전송이 되는지 확인하기 위해 쿠키를 생성하려고 하였지만 쿠키는 클라이언트에서 생성하기 때문에 생성이 되지 않았다. 하지만 데이타베이스에 저장하는 코드를 적으니 데이타베이스에 값이 저장 되는 것을 볼 수 었다. 



----- 추가 -----

import urllib

import urllib2


url = 'http://xxx.xxx.x.xxx/reciever.php'

payload = {"device":"gabriel","data_type":"data","zone":1,"sample":4,"count":0,"time_stamp":"00:00"}

headers = {'content-type': 'application/json'}    

data = urllib.urlencode(payload)

req = urllib2.Request(url, data, headers)

response = urllib2.urlopen(req)

the_page = response.read()




구글링할때 가장 많이 보는 코드인데 

3.0버전에서는urllib2가 분리되어서 작동하지 않는다. 아래 처럼 코드를 작성하면 request가 아닌 urllib로 urllib2를 대신 할 수 있다.


import urllib.request 

userdata = {"firstname": "John", "lastname": "Doe", "password": "jdoe123"} 

userdata = urllib.parse.urlencode(userdata) 

binary_data = userdata.encode('utf-8') 

resp = urllib.request.urlopen('http://localhost/test/testing.php', binary_data) 


댓글()

파이썬 버전 3.5 exe 파일로 만들기

Computer 비관심/PyQt5|2017. 1. 16. 16:56
반응형

Python과 PyQt를 사용해서 프로그램을 만든 뒤 EXE파일로 만드는 방법


python 3.5버전은 py2exe가 되지 않는다. EXE 파일로 꼭 만들고 싶어서 헤매고 헤맨뒤에 PyInstaller라는 모듈을 찾았다.

이 모듈을 사용하면 정말 쉽게 .py파일을 .exe파일로 컴파일 할 수 있다. 다음은 exe파일로 바꾸는 과정이다.


****** 추가 ******** 


**2020 7월 23일 **

1. 용량이 너무 커서 줄이는 법을 확인해보니

가상환경을 만들고 거기에 사용할 모듈들을 설치하고 pyinstaller도 설치한 뒤 

pyinstaller 파일이름.py를 실행하면 exe로 만드는 시간도 줄 뿐더러 용량역시 줄어든다. 


2. 아이콘을 바꾸고 싶으면 커멘드에 

-i "icon.ico"

아이콘을 ico파일로 바꾼뒤 -i "파일명.ico"를 추가한다.

*******************


1. pyinstaller 설치하기

pyinstaller는 파이썬 코드를 EXE로 만들어주는 기능을 제공한다.

파이인스톨러를 설치 하기 위해서 일단 터미널에 pip install pyinstaller 를 입력한다.



2. 파이썬 파일을 EXE 파일로 만들기 (기본)

터미널에서 exe파일로 만들 스크립트가 저장된 폴더로 들어가 pyinstaller 파일이름.py  을 입력한다.


끝! 이렇게 간단하게 .py파일이 .exe로 컴파일 된다. 하지만... exe파일을 실행해보면 커맨드창과 함께 gui프로그램이 실행된다. 

참고로 이 커맨드 창은 쓸모 없는 것이 아니다. 나중에 디버깅을 할 때 중요하다. 


하지만 남들한테 배포하고 싶을땐 저 커멘드가 있으면 완성되지 않은 느낌일  것이다. 그럼 저 커맨드 창을 어떻게 하면 없엘 수 있을까?



3. 파이썬 파일을 EXE 파일로 만들기 (커맨드창 제거)

커맨드에 -w 플래그를 붙여주면 커멘드창이 EXE파일과 함께 나오지 않는다.

pyinstaller -w 파일이름.py



그러면 이렇게 testing.exe 파일을 실행하면 커맨드창 없이 깔끔하게 실행이 된다. 만족스럽다.

그런데 exe파일이 저장된 폴더를 보면 exe파일 말고도 많은 프로그램들이 같이 만들어진다. 파일이름을 보니 사용했던 모듈과 관련된 파일들임을 알 수 있다. 

만약 더 욕심을 내서 exe파일 하나로 끝내면서도 커맨드창이 나오지 않기를 바란다면 다음과 같이 입력하면 된다.


4. 파이썬 파일을 EXE 파일로 만들기 (통합실행파일 만들기)

통합파일을 만들때 고려해야하는 점이 한가지가 있는데, 통합파일로 만들면 프로그램을 처음 띄울때 속도가 느려진다.

pyinstaller --onefile -w 파일이름.py

어째튼, 다음과 같이 파일이 exe파일 하나면서 뒤에 시컴한 커맨드 창이 나오지 않도록 py파일을 컴파일 할 수 있다!!!





관련글 - 파이인스톨러 EXE 파일 제작시 디버깅 방법과 훅에러 해결: https://infocentre.tistory.com/46?category=597740




------------------- 원문 from stack overflow----------------------

You can use PyInstaller which support python 3.5.

To install it with pip execute in terminal: pip install pyinstaller

To make the .exe file:

pyinstaller --onefile scriptname.py




This might not be directly related to your question but i think it is worth trying.

You easily do so Using PyInstaller by usin the following code.

pyinstaller -w scriptname.py

Just as simple as that and every thing is settled.



댓글()