Python에서 class 선언시 object를 꼭 상속 받자

python은 전역 객체를 선언할 경우 해당 클래스를 메모리에 올리는 초기 작업에서 실행 된다. 예를 들어 다음과 같은 코드에서 # 1, # 2 순서로 실행된다.

import lahuman

class test(object):
	a = lahuman.A() # 1 : 

	def b(self):
		pass

main python

import test # 1

if __name__ == '__main__':
    t = test()
    t.b() # 2

또한 test 클래스가 object를 상속 받지 않을 경우 객체 생성시 object를 상속 받지 않으면 객체생성시 new 메소드가 호출되지 않는다.



Posted by lahuman

파이썬을 이용한 압축 해제와 동시에 파일 이름 변경

특정 사이트에서 대량의 압축된 파일을 받아 하나의 디렉터리에 풀어야 하는 미션이 떨어졌다.

문제는 같은 파일 명이 중복으로 발생할 수 있다.

이에 대한 해결책으로 다음 2개의 방법으로 고민했다.

  1. 파일 압축 해제 후 MV 명령어로 이름 변경
  2. 압축을 해제할 때 PATH를 줄 수 있는가?

1번의 방법은 누구나 쉽게 할 수 있을 것 같았다.

2번의 경우 가능 한지 조차 몰라서 Python에서 압축 관련 모듈인 ZipFile을 살펴보았다.

내용을 확인 결과 압축 파일에서 하나의 파일을 읽을 수 있는 read리는 function이 있다.

이를 이용해 다음과 같이 처리하였다

with ZipFile("filename.zip") as zf:
    
    file_list = map(lambda x: "/" + str(uuid.uuid4()), zf.filelist) # 파일 개수만큼 uuid를 생성
    idx = 0
    for zip_file in zf.namelist():  # 루프를 돌며 하나의 파일을 가져옴
        target_path = zip_save_path + file_list[idx]  # 저장되는 파일 위치
        with open(target_path, "wb") as f:  # 저장되는 파일을 쓰기 모드로 오픈
            f.write(zf.read(zip_file, pwd=self.password))  # 압축된 파일을 읽어서 타깃 파일로 저장

        idx += 1 # 다음 uuid 선택

파일은 내가 원하는 위치에 uuid 값으로 저장된다.

참고자료


Posted by lahuman

특정 디렉토리에서 구조를 출력 하는 방법

디렉토리의 구조를 출력 하는 방법은 2가지가 있다.

  1. Tree 모듈을 설치 한다.

tree 명령어는 많은 옵션을 제공하고 널리 사용되는 모듈이다.

다만 쉬운 설치를 위해서 인터넷이 되어야 한다.

  1. Command 를 이용한 출력
find . -type d | sed -e "s/[^-][^\/]*\//  |/g" -e "s/|\([^ ]\)/|-\1/"

설치가 필요 없고 단순하게 철력이 가능하다. 다만, 옵션이 없기 때문에 COMMAND를 조합 해야 한다. 예를 들어 abc 디렉토리를 제외 하고 싶다면 다음과 같은 명령어를 실행 해야 한다.

find . -type d | grep -v abc | sed -e "s/[^-][^\/]*\//  |/g" -e "s/|\([^ ]\)/|-\1/"

일회성으로 쓰기 좋다!

참고 자료


Posted by lahuman

QRadar SDK를 Ubuntu 16.x에서 사용하기 위한 모듈 교체 작업

먼저 QRadar SDK를 받아야 한다.

설치는 간단하게 압축을 해제 하고 install.sh 을 실행하면된다.

설치 하고 나서 이후 의존성 문제로 qradar_app_creator 명령어를 실행하면 오류가 발생한다.

Python 버젼은 2.7.9 이상이라고 되어 있지만 기본적으로 2.7.15가 설치 되어 있다. 상위 버젼이면 호환성에 문제가 없을 것이라 생각했지만, 모듈 오류가 많이 발생하므로 2.7.9를 설치하자

Python 설치에 필요한 모듈을 함께 설치 한다.

sudo apt-get install python-pip python-dev
sudo apt-get install build-essential
sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev

wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz
tar -xvf Python-2.7.9.tgz
cd Python-2.7.9/
 ./configure --enable-unicode=ucs4  # 추후 pycrypto 모듈 관련 오류 발생을 예방하기 위해 --enable-unicode=ucs4  처리를 한다.
make
sudo make install
sudo shutdown now -r

qradar_app_creator 명령어를 입력하면 몇개의 모듈이 해당 시스템을 지원하지 않는다는 메시지를 확인 할수 있다.

관련해서 pip download 를 이용해 해당 모듈을 수동으로 교체 한다.

pip download cffi==1.11.5
sudo cp cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl /usr/local/etc/QRadarAppSDK/src_packages/

pip download cryptography==1.8.1
sudo cp cryptography-1.8.1.tar.gz /usr/local/etc/QRadarAppSDK/src_packages/

pip download pycrypto==2.6.1
sudo cp pycrypto-2.6.1.tar.gz /usr/local/etc/QRadarAppSDK/src_packages/

# 더 있을 경우 pip download를 이용해서 받아 /usr/local/etc/QRadarAppSDK/src_packages/로 옮긴다.

마지막으로 실행 스크립트에서 교체된 모듈의 이름을 변경한다.

sudo vi /usr/local/bin/qradar_app_creator

# 모듈 명을 바뀐 파일로 변경하면 된다.
"|cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl|cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl|cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl|cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl|workspace"

모듈 교체는 어려운 작업은 아니지만, 하나한 확인해야 하므로 손이 많이 간다.

참고 주소


Posted by lahuman