'MINERVA/Python'에 해당되는 글 47건
- 2024.01.19 :: [Python] 스크립트가 동결된 실행 파일(frozen executable)이란?
- 2024.01.05 :: [Python] PyQt5, PyQt6 and PySide6 라이선스 설명
- 2023.12.27 :: [Python] 엑셀 파일을 읽을 때 숫자 앞에 있는 어포스트로피( ' )
- 2023.11.26 :: [팁] ERROR: No matching distribution found for pythoncom 1
- 2023.10.08 :: [Python] pandas 'Unnamed: 0 column'
- 2023.10.05 :: [Python] anaconda 32bit 환경 구축
- 2023.09.16 :: [Anaconda] conda install vs pip install
- 2023.08.21 :: [Python] Anaconda 가상환경 패키지 관리
- 2023.08.20 :: [Python] 패키지 일괄 업데이트
- 2023.08.20 :: [Python] WARNING: Ignoring invalid distribution 1
PyInstaller와 같은 Python 패키징 도구를 사용하여 Python 스크립트를 독립 실행 가능한 실행 파일로 변환한 것을 의미합니다. 동결된 실행 파일은 일반적으로 사용자가 Python을 설치하지 않고도 애플리케이션을 실행할 수 있도록 만들어진 것입니다.
Python 스크립트와 해당하는 종속성들을 하나의 실행 파일로 번들로 묶어줍니다. 이로써 사용자는 Python 인터프리터나 필요한 패키지를 별도로 설치하지 않고도 애플리케이션을 실행할 수 있습니다.
동결된 실행 파일은 다음과 같은 특징을 가지고 있습니다:
- 독립성: 사용자가 별도의 Python 인터프리터나 패키지 설치 없이 애플리케이션을 실행할 수 있습니다.
- 포터빌리티: 동결된 실행 파일은 특정 플랫폼(운영체제)에 종속되지 않고, 여러 플랫폼에서 실행될 수 있도록 만들어집니다. 예를 들어, Windows에서 생성된 동결된 실행 파일은 Windows 환경에서 실행되며, macOS 또는 Linux에서 생성된 것은 각각의 환경에서 실행됩니다.
- 보안 강화: 사용자는 일반적으로 실행 파일만 받아서 실행하면 되므로, 스크립트 소스 코드나 종속성에 대한 직접적인 액세스가 어려워져 보안이 강화됩니다.
- 성능 향상: 번들로 묶인 실행 파일은 일반적으로 실행 시간에 필요한 리소스를 더 효율적으로 관리하여 성능이 향상될 수 있습니다.
스크립트가 동결된 실행 파일로 변환되면, 실행 파일이 실행될 때 PyInstaller나 유사한 도구가 _MEIPASS와 같은 메커니즘을 사용하여 애플리케이션에 필요한 리소스를 임시 디렉토리에 추출하고 실행합니다.
개인적으로 문의를 주신 분이 있어 간단하게 설명을 드립니다.
1. PyQt5
https://choiwonwoo.tistory.com/entry/QT-%EB%9D%BC%EC%9D%B4%EC%84%A0%EC%8A%A4-%EC%A0%95%EC%B1%85
결론적으로 PyQt5는 GPL과 LGPL이 혼재되어 있지만, 상업용 버젼을 개발하는데는 문제가 없습니다.
그렇지만, IOS기반의 App을 개발할때는 dynamic-linking이 지원되지 않기 때문에 문제가 될수 있습니다.
2. PyQt6 - GPL
라이선스 정책이 GPL이기 때문에 라이센스가 반드시(?)필요합니다.
만약 개발된 앱이 대박(?)을 치면 분명히 라이선스 문제가 발생함.
그래서, 상업용 버젼의 APP 개발을 생각한다면 라이선스를 구매해야 함.
3. PySide6 - LGPL
결론부터 설명을 한다면, 상업용 버젼의 APP을 개발을 생각한다면 이것을 사용하는게 맞음
dynamic-linking만 사용한다면 소스공개의 의무를 피하면서, 상업용 개발도 가능함.
4. 결론
PyQT를 사용하는 경우, PyQt5를 사용해서 개발을 진행하고 있으며, 신규 프로젝트인 경우는 PySide6를 사용하고 있음
그런데, 한가지 문제가 이전 개발 버젼(특히, 32Bit 지원...휴...)은 PySide6가 지원되지 않기 때문에, PyQt5를 사용해야함.
엑셀파일의 셀내용이 숫자인 경우 어포스트로피( ' )가 있습니다. 이경우는 해당숫자가 텍스트로 서식이 지정되었음을 의미합하고, 엑셀파일안에서 작업을 한다면 쉽게 숫자 변환을 하여 작업을 하면됩니다.
하지만, Python에서 엑셀 파일을 읽을 때 숫자 앞에 있는 아포스트로피( ' )는 숫자를 문자열로 인식하게 하므로, 숫자를 정수 또는 부동 소수점으로 변환할 때 문제가 발생합니다.
그래서 아래와 같이 어포스트로피( ' )를 제거하는 작업을 진행하여야 합니다
# 엑셀 파일 읽기
df = pd.read_excel('test.xlsx')
# 모든 열에 대해 아포스트로피 제거
df = df.map(lambda x: str(x).lstrip("'"))
pythoncom은 이름에서 짐작 할 수 있듯이, 파이썬이 윈도우 환경에서 COM(Component Object Model)을 통해 Windows 시스템의 다양한 서비스 및 기능을 사용하기 위해 사용하는 패키지입니다.
그런데, pythoncom 을 일반적(?)인 방법으로 설치를 하면 꼭 아래와 같이 에러가 발생합니다.
(mmP310_32B) C:\Users\CHOI>pip install pythoncom
ERROR: Could not find a version that satisfies the requirement pythoncom (from versions: none)
ERROR: No matching distribution found for pythoncom
pythoncom 기능을 사용하기 위해서는, 아래와 같이 해야 합니다.
(mmP310_32B) C:\Users\CHOI>conda install pywin32
그 이유는 pythoncom 모듈은 PyWin32 라이브러리에 포함되어 있기때문입니다.
개발 경험이 쌓이게 되면, 자기만의 라이브러리(?)가 샘기게 됨과 동시에 동시에 기초적인 문법등을 깜빡하게 됨을 느끼게 되네요. ㅠㅠㅠ
1. 'Unnamed: 0 column' 생성 이유
pandas를 통해 엑셀 또는 CSV 파일을 읽는 경우 ''Unnamed: 0 column' 이 생기는 경우가 발생
원인: 대상 파일(엑셀 또는 csv)에 지정된 인덱스 열이 없기 때문이다.
그래서, pandas는 default로 'Unnamed: 0'로 인덱스를 생성함
2. 'Unnamed: 0 column' 없애는 방법
df = pd.read_excel(fileName,index_col=0)
파일을 읽을때, 위와 같이 명시적으로 인덱스를 명시적으로 'index_col = 0'을 설정
또는
df.drop(['Unnamed: 0'], axis=1, inplace=True)
몇시적으로 컬럼을 제거해도 됩니다.
3. 결론
단순한 내용이지만, 모르면 조금 번거로운 내용이어서 정리합니다.
역사(?)를 가지고 있는 있는 소프트웨어의 경우 아직도 32bit SDK만을 제공하는 경우가 있음(예: 증권 HTS등)
그래서, 개발을 진행하기 위해서는 32bit 환경이 필요함
1. Anaconda Prompt 실행: OS 환경 확인
> conda info
platform : win-64 <---- 64bit os 환경 확인
2. 32bit OS 환경으로 변경
>set CONDA_FORCE_32BIT=1
platform : win-32 <---- 32bit os 환경 확인
cf) 참고: 환경을 다시 64bit로 전환할때는 set CONDA_FORCE_32BIT=0 실행
3. 32bit 가상환경 만들기
> conda create --name <가상환경명>
4. 생성된 가상환경 확인
>conda env list
5. 생성된 가상환경 진입
> conda activate mm32Bit
1. 기능 설명
- conda와 pip는 패키지 관리를 한다.
- pip install <패키지명> , conda install -c conda-forge <패키지명>
- pip repository는 https://pypi.org/이고, conda repository는 https://conda-forge.org/, https://repo.anaconda.com/pkgs/이다.
2. 차이점
- pip와 conda는 패키지를 가져오는 곳이 다름(당연함^^)
- 패키지 안정성(?)은 conda가 더 좋음, pip는 가끔 소스를 내려받아 cpp빌드를 하면서 문제가 발생하지만,conda는 os환경에 적합하게 미리 빌드된 패키지를 설치.(conda는 패키지 빌드시 의존성을 고려하기 때문에 사용하기 쉽고, 일괄 업데이트도 쉽다.(conda update --all))
- 하지만, conda는 pip보다 오래된(?) 버젼일수 있음
2. 정리
- anaconda 환경에는 가급적 pip를 사용하지 않는 것이 좋다. 왜냐면, 패키지 의존성(Dependency)에 문제 생김
- conda를 통해서 최대한 설치하고, 없으면 pip를 하용하지만, 추후 conda를 통해서 지원한다면, pip를 통해서 설치된 버젼을 제거하고, conda를 통해서 재설치를 추천 함.
기본 가상환경에서의 패지지 관리와 유사하지만,
Anaconda 가상 환경에서 패키지 관리 방법을 정리하면 아래와 같습니다.
[참조]
1.Anaconda prompt
2. 가상환경(anaconda) 업데이트 진행
- 진행순서: conda -> python -> pip --> 패키지 업데이트
2.1 현재 상용중인 환경 확인
2.2 업데이트
3. conda 기본 명령어
3.1 설치된 패키지 확인
> conda list
3.2 사용중인(이미 생성된) 가상환경 확인
>conda env list
이외 기본적인 명령어는 위에 링크된 가상환경 관리 부분을 보면 쉽게 이해가 될것이라고 생각됩니다.
4. 정리
라이브 서비스를 도커(Docker)로 넘겨서 관리를 하기는 하지만, 개인적인 경험으로 개발단계에서는 아나콘다를 사용하는것이 직관적이면서 관리가 쉬운것으로 생각됩니다.
사용중인 패키지를 일괄 업데이트 하기 위해서 pipupgrade(파이썬 패키지 관리자)가 필요합니다.
1. pip 업그레이드
pipupgrade(파이썬 패키지 관리자)를 사용하기 위해서는 최신버젼으로 업그레이드를 진행
>python.exe -m pip install --upgrade pip
Collecting pip
Using cached pip-23.2.1-py3-none-any.whl (2.1 MB)
Installing collected packages: pip
Attempting uninstall: pip
Found existing installation: pip 20.2.3
Uninstalling pip-20.2.3:
Successfully uninstalled pip-20.2.3
Successfully installed pip-23.2.1
2. pipupgrade 설치
> pip install pipupgrade
Requirement already satisfied: pipupgrade in d:\dev\python39\lib\site-packages (1.12.0)
Requirement already satisfied: pip in d:\dev\python39\lib\site-packages (from pipupgrade) (23.2.1)
Requirement already satisfied: bpyutils in d:\dev\python39\lib\site-packages (from pipupgrade) (0.5.8)
3. 설치된 패키지 확인
>pipupgrade --check
이 명령을 실행하면 설치된 패키지들 중에서 업그레이드 가능한 패키지들의 목록이 표시되며, 사용자의 승인하에 업그레이드를 진행할 수 있습니다.
4. 일괄 업데이트 진행
>pipupgrade --verbose --latest --yes
5. 정리
개인적은 경험으로 C/C++과 비교해서 파이썬이 좋은 점이 패키지(라이브러리) 버젼관리가 쉽다는 점이다.
물론, 아주 가끔 파이썬 신버전에서 동작하지 않는 패키지가 있기는 했지만. 그래도 단점보다는 장점이 많아 보입니다.
pip 업데이트를 진행시, 위와 같은 경고(warning)을 보게되는 경우가 있습니다.
개발을 진행하는 데는 문제가 없지만, 기분이 깔끔하지 않기에 아래와 같은 경고 메시지가 보였을때는 아래와 같이 처리하 처리하면 됩니다.
발생원인은 업데이트를 진행하는 디렉토리에 먼가 이상한, 유효한지 않은(invalid) 내용이 있기 때문입니다.
그래서 경고가 발생한 패키지의 디렉토리를 확인해보면, 이상한 디렉토리가 존재하는 것을 확인 할수 있습니다.
임시디렉토리(~)가 생긴 원인은 이전에 업데이트를 진행하면서 실패하였을때 생긴것으로 추정됩니다.
일단 위의 임시디렉토리(~)를 모두 지워주세요.
그리고, 다시 업데이트 진행하여주시면 경고문 없이 진행되는 것을 확인하실수 있습니다.
감사합니다.