티스토리 툴바


  • 다시 계절학기가 시작되고 내일 모레 또 기말고사다..ㅠ 이번엔 말리지 말아야지..하면서도 Computing~(여긴 성대 도서관) 2007-07-11 12:47:43

이 글은 WebPCE™님의 2007년 7월 11일의 미투데이 내용입니다.

Posted by WebPeace™

<시작>

간단한 WebTool들의 Automation을 위해 cPAMIE를 통한 Internet Explorer의 Control을 많이 이용함

하지만, Internet Explorer의 Automation을 도와주는 cPAMIE는 다음 문제를 가지고 있다.

- 하위 호환성 문제 (cPAMIE for Python 2.4와 2.6의 문법 및 동작이 다름)
- COM(Component Object Model)을 통해 Internet Explorer과 통신하기 때문에 Windows 환경에 종속적
- 고급적인 Browser Control을 위해서는 COM에서 사용하는 함수를 알아야 함

이를 해결하기 위해 다양한 Platform에서 동작하는 WebBrowser Control (Automation) Tool인 Selenium을 이용

<Firefox 3.0.x 설치>

 Firefox 공식페이지

<Selenium-Core XPCom 및 Selenium-Core Server의 설치>

 Selenium-CoreXPI : (Firefox Module이므로 Firefox에서 설치) 
 Selenium-RC : 해당 파일을 다운 받아 selenium-server-1.0-beta-2 폴더만을 압축을 풀어 특정 폴더에 복사

<Selenium-Core Server의 실행>

 Windows나 리눅스/Mac의 Terminal을 열어 selenium-server의 압축을 푼 폴더로 이동하여 해당 명령을 실행함으로써 Server를 가동한다.

Prompt> java -jar selenium-server.jar -interactive

<Python-SeleniumRC Module의 설치>

- easy_install을 통해 SeleniumRC Client-Driver Python Module를 설치한다.

Prompt> easy_install selenium


<Script Test 예제 (Google 검색)>

- 다음 스크립트 파일을 Python에서 Test 해보도록 한다.

import selenium
# Selenium Connection 인스턴스 생성
a = selenium.selenium("localhost", 4444, "*firefox", "http://www.google.com")

# 해당 인스턴스 정보에 따라 Firefox에 창을 생성
a.start()

# http://www.google.com을 기준으로 /의 위치의 문서 열기 -> http://www.google.com/
a.open("/")

# q라는 form input 개체안에 SearchKeyword라는 단어를 입력한다
a.type("q", "SearchKeyword")

# BtnG 이름을 가진 버튼 클릭 (Google의 폼 전송 버튼이 BtnG)
a.click("btnG")

# 검색결과창의 HTML 소스를 긁어온다.
source = a.get_html_source()

# 창 닫기
a.close()

# 인스턴스 해제 및 Firefox의 종료
a.stop()
Posted by WebPeace™

<시작>

shell 접속을 자동화하기 위해 Python에서 SSH를 접속하는 모듈을 필요로 함
해당 모듈이 paramiko이며 pycrypto에 대한 Dependency가 있어 먼저 pycrypto를 설치해야 함

(easy_install를 이용한 설치가 보통 쉬우나 win32에서는 pycrypto의 소스코드 컴파일에 따른 스크립트 수정이 필요하므로 각개격파로 설치)

(1) pycrypto 설치

  • 정식 배포본은 소스코드로만 배포되는데 소스코드의 컴파일을 위해서는 Cygwin의 MingW나 VS.NET 2003을 필요로 하므로 미리 컴파일된 파일을 첨부했음

    Pycrypto Win32 Binary for Python 2.4: pycrypto-2.0.1.win32-py2.4.zip
    Pycrypto Win32 Binary for Python 2.5: pycrypto-2.0.1.win32-py2.5.zip

    각자 자신의 컴퓨터에 맞는 Python 버전을 선택하여 바이너리를 설치하도록 한다. (Windows Installer이므로 쉽게 설치 가능함)

(2) Paramiko 설치

  • 정식 배포본 : paramiko-1.7.4.zip

    다운로드 후 압축을 푼다.
    시작 -> 실행 -> cmd (명령 프롬프트 열기)
    아래처럼 커맨드 창이 뜨면 python setup.py install이라 입력하고 엔터

C:\paramiko-1.7.4> python setup.py install

(3) 테스트

  • IDLE나 Python Command에서 다음과 같이 입력한다.

>> import paramiko
  • 아무런 에러없이 import가 진행되면 설치 완료


<Paramiko DEMO Test>

para_demo.zip

(1) 위의 demo파일을 다운로드 받아 특정 폴더에 압축을 푼다.
(2) demo.py 실행

C:\para_demo> python demo.py

<타 프로그램에 이용하기 위한 간단한 예제>

import paramiko import sys import socket import os # SSHClient 인스턴스 생성 client = paramiko.SSHClient() # 저장된 Host 키값이 없으면 Policy에 따라 자동적으로 Host 키값 추가 client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # SSH 접속 정보 입력 client.connect(hostname='ipaddress', username='ID', password='PW') # 실행할 커맨드 입력 stdin, stdout, stderr = client.exec_command("ls -al") # 접속 종료 client.close() # SSH에서 결과로 뿌려주는 output 출력 (stdout) for line in stdout: print line.strip('\n')
주의) 이 프로그램은 cd나 pwd와 같은 명령어를 통한 폴더 이동 후 interactive한 path의 유지가 불가능함
둘 이상의 interactive한 명령어를 실행하려면 Thread를 통해 SSH의 Channel Session을 유지시켜줘야 함. 
이는 위의 para_demo.zip의 interactive.py 코드의 windows_shell()이나 posix_shell() 참조 
관련문서 : http://www.lag.net/pipermail/paramiko/2007-December/000582.html 

팁) 확인 해 본 결과 아래식으로 몇가지의 명령어를 동시 실행 가능하다 
(원래 터미널에서 ;로 여러 명령어를 한 줄에 쓸 수 있음)

# 명령어 리스트
cmd_list = ['cd target', 'ls -al', 'quelist']

# ;로 붙이기
req = ';'.join(cmd_list)

# 커맨드 실행
stdin, stdout, stderr = client.exec_command(req)
Posted by WebPeace™

Python에서는 일반적인 형식의 데이터가 아닌 형태를 포함하고 있는 list를 정렬 할 때 key를 통한 효율적인 sort가 가능함

Key에 입력되는 Argument는 Variable이 아니라 Function 이름 (Pointer)임

# Sort를 하는 기준인 Key를 반환하는 Function : input된 list의 두번째 value를 반환
def sortrule_selection(item):
    return item[1]

# 위에서 정의한 Method
a = [[1, 5], [3, 4], [4, 7], [2, 6]]
a.sort(key=sortrule_selection)

# 또는 lambda를 이용하여 직접적으로 함수의 정의가 가능함, 위와 같은 기능을 하는 코드
a.sort(key=lambda item:item[1])
Posted by WebPeace™

Linux 및 Mac OS X의 POSIX 기반의 운영체제에서 작동하는 wxPython Module은 기본적으로 문자셋을 지정해줘야 인식함

문자셋 지정 예 

# -*- coding: cp949 -*-
# -*- coding: utf8 -*-
# -*- coding: ansi -*-
Posted by WebPeace™