파이썬 디버깅시 유용하게 사용하는 Ipdb로 디버깅하는 도중 루프안에 같혀 강제 종료해야할 경우 

아래 혹은

import sys
sys.exit()

아래의 방법으로 시도한다 (2.7과 3.5 버전의 경우 현재 확인결과 아래 방법으로 작동되었다)

import os
os._exit(0)


Flask 를 윈도우에서 개발하여 리눅스 서버에 배포할 일이 생겼느데


리눅스에서는 잘만 설치되는 Flask 가 윈도우 가상환경에서는 오류를 뱉어내면서 설치되지 않았다.


해결방법이 두가지가 있는데 


setupuptools 의 최신버전에 의한 오류


구글에 알아보니 setupuptools 버전을 낮추는 방법과 Wheel 버전을 다운받아 설치하는 방법이 있었다. 


1. setuptools 를 이용한 방법은 아래와 같다. 

pip install setuptools==21.2.1

pip install flask


2. 설치파일 직접 다운로드 후 setup.py 실행

홈페이지에서 setup 관련 파일을 직접 다운받은후에 python 으로 바로 실행하도록 하자. 




참고:

http://stackoverflow.com/questions/38243633/falied-to-install-flask-under-virutalenv-on-windows-error-2-the-system-cann

예외처리를 하다보면 기본 내장된 예외말고 커스텀 익셉션으로 처리할일이 많이 있다. 

Python 에서 Exception 처리를 어떻게 하게 하면 좀더 명확한 메시지 저달을 위해 Exception 에 Dictionary 타입도 전달가능하다

만드는 방법은 매우 간단한다. Exception 을 상속받아서 만들면 끝. 예제코드를 보자

EX)

class FileNotFoundException(Exception):     pass 

위와 같이 선언한후 Exception 필요한부분에 사용하면된다 


try:

raise FileNotFoundException("에러 메시지")

excep FileNotFoundException as e:

print e

와 같이 하면 "에러 메시지" 가 출력된다. 



참고: 

http://stackoverflow.com/questions/1319615/proper-way-to-declare-custom-exceptions-in-modern-python

Jupyter notebook 에서 멀티 파이써 환경에서 동작하는 방법을 구글링을 통해서 알게되었다.


Anaconda 가 미리 설치되어 있는 환경에서 동작한다고 가정한다.



Python 2.7의 경우

conda create -n py27 python=2.7

source activate py27

conda install notebook ipykernel

ipython kernel install --user

configure the python3.5 environment:


Python 3.5의 경우

conda create -n py35 python=3.5

source activate py35

conda install notebook ipykernel

ipython kernel install --user



참고: 

http://stackoverflow.com/questions/30492623/using-both-python-2-x-and-python-3-x-in-ipython-notebook


파이썬으로 무언가 기록을 영구적으로 저장하고 싶을때 자주 쓰게 되는 것으로 ipython notebook 있었다.

Ipython 공식홈페이지에서도 볼수 있다시비 Ipython 은 여러기능을 통합적으로 제공하는 Jupyter 란 이름으로 변경되었는데 


Jupyter 노트북의 사용법에 대해 알아보자 


사용법은 아주 직관적으로 jupyter 패키지를 설치후 바로 이용하면된다. 


pypy 를 통해 jupyter 를 먼저 설치한다 


pip install jupyter


jupyter notebook 파일 이름


* 파이썬 패키지를 설치하다보면 원인 모를 이유에 의해 설치가 되지 않을때가 가끔있다. (컴파일러 및 운영체제 의존및 등등..) 

이럴때 Anaconda 혹은 Canopy 와 같은 vendor 들을 사용하면 패키지가 잘설치된다.

공통으로 사용하는 파이썬 스크립트를 OS 별로 다르게 동작하는 로직을 집어넣야 하는 일이 생겨 파이썬 자체내에서 OS환경을 검사하는 #기능이 있나 검색을 해보니

역시 파이썬! 

내장 모듈인 platform 을 이용해서 검사한다. 

사용법은 아주 간단한다.

import platform

platform.platform() # 현재 OS에 정보

platform.system() # 현재 OS 이름

platform.release() # 현재 OS release 넘버

platform.version() # 현재 OS version 에 대한 정보

platform.machine() # 현재 OS 설치된 CPU 아키텍쳐 정보

# 맥용 함수

platform.mac_vers()

# 리눅스용 함수

platform.linux_distribution()

 

참고: 

1. https://docs.python.org/3/library/platform.html#platform.platform

2. http://stackoverflow.com/questions/110362/how-can-i-find-the-current-os-in-python

 

Python 자체의 Hang 현상때문에 프로레스가 출력 값을 리턴하지 않으면 강제 종료 하는 기능을 구현

파이썬에 의해 실행되는 프로그램이 30분이상 걸리지 않는 다는 전제 하에 실행하기로 한다.

파이썬 3.3+ 버전때부터는 프로세스를 실행하는 함수자체 내에서 timeoout 기능을 지원한다.

2.7 버전 subprocess:

https://docs.python.org/2/library/subprocess.htm

3.5 버전 subprocess

https://docs.python.org/3/library/subprocess.html

위 두버전의 문서를 체크해보면

2.7 버전에서

subprocess.check\_output(args, \*, stdin=None, stderr=None, shell=False, universal\_newlines=False)

3.5 버전에서

subprocess.call(args, \*, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)

차이가 있는 것을 볼수 있다.

2점대 버전에서

* threading 을 이용해 우회적으로 구현하는 방법이 있긴 있다.

http://stackoverflow.com/questions/1191374/using-module-subprocess-with-timeout

* Hang현상은 프로세스에 말그대로 Hang(걸려)있는 현상으로 프로그램이 정상적으로 종료되지 않고 계속적으로 남아있는 현상이다.

* 추가팁:

파이썬 스크립트 동작 추적하기

python -m trace --trace 파이썬스크립트파일.py

참고자료:

http://stackoverflow.com/questions/3443607/how-can-i-tell-where-my-python-script-is-hanging

현재 유저의 이름에 따라 다르게 실행하는 함수 구현

Python에서 현재 실행 중인 시스템의 사용자를 가져오고, 사용자 이름에 따라 다른 동작을 수행하려면 getpass 모듈의 getuser() 메서드를 사용할 수 있습니다.


기본 예제

getpass.getuser()를 사용하여 현재 시스템 사용자의 이름을 가져올 수 있습니다.

코드 예시

import getpass

# 현재 사용자 이름 가져오기
current_user = getpass.getuser()
print(f"Current user: {current_user}")

출력

Current user: ethan

사용자에 따라 다른 작업 실행

아래는 사용자 이름에 따라 특정 동작을 실행하는 함수의 예제입니다.

코드 예시

import getpass

def execute_based_on_user():
    # 현재 사용자 이름 가져오기
    current_user = getpass.getuser()

    # 사용자 이름에 따라 다르게 동작
    if current_user == "ethan":
        print("Hello Ethan! You have admin privileges.")
        # Ethan 전용 동작
    elif current_user == "alice":
        print("Hi Alice! Limited access granted.")
        # Alice 전용 동작
    else:
        print(f"Hello {current_user}! Default access granted.")
        # 기본 동작

# 함수 실행
execute_based_on_user()

출력 (사용자에 따라 다름)

Hello Ethan! You have admin privileges.

또는

Hi Alice! Limited access granted.

참고사항

  • getpass.getuser()는 환경변수 LOGNAME, USER, LNAME, USERNAME 중 첫 번째로 유효한 값을 반환합니다.
  • 보안 주의사항: 사용자 이름은 신뢰할 수 없는 환경에서는 보안적으로 민감하지 않은 작업에만 사용하는 것이 좋습니다.

추가 기능: 사용자 이름 기반 권한 시스템

아래는 사용자 이름에 따라 권한을 설정하는 간단한 예제입니다.

코드 예시

import getpass

def get_user_permissions():
    # 사용자별 권한 설정
    permissions = {
        "ethan": "admin",
        "alice": "read-only",
        "bob": "editor"
    }
    # 현재 사용자 가져오기
    current_user = getpass.getuser()

    # 권한 가져오기
    user_permission = permissions.get(current_user, "guest")
    return user_permission

# 권한 확인
permission = get_user_permissions()
print(f"Current user permission: {permission}")

출력

Current user permission: admin

참고 자료

  1. Python 공식 문서 - getpass 모듈
  2. Python getuser 동작 설명

Python 을 활용하여 시스템 명령어를 내리는 작은 규모의 모듈을 작성하는 일이 많기 때문에 자주 이용한다.

 

방법:

  1. os 내장 모듈 사용
  2. subprocess 모듈 내장 사용 (추천)

단순 명령어 실행:
1. os.system(명령어)
ex) os.system("ls -al")

2. subprocess.call("명령어")
ex) subprocess.call("ls -al")

시스템 출력결과 얻는법


1. 화면으로 출력

2. 파일로 저장

+ Recent posts