레이블이 python인 게시물을 표시합니다. 모든 게시물 표시
레이블이 python인 게시물을 표시합니다. 모든 게시물 표시

python - pxssh를 이용한 ssh connect & send command

pxssh를 이용하면 ssh를 이용해 linux에 접속하여 직접 command를 날릴 수 있고, 반환값도 받아 올 수 있습니다.

먼저 pxssh를 이용하기위해 모듈 pexpect를 설치해줍니다.

# wget https://pypi.python.org/packages/source/p/pexpect/pexpect-4.0.1.tar.gz#md5=056df81e6ca7081f1015b4b147b977b7

# tar xvf pexpect-4.0.1.tar.gz

# cd pexpect-4.0.1.tar.gz

# python setup.py install

먼저 모듈을 아래와 같이 로드해줍니다.

from pexpect import pxssh

현재 파이썬 3.x버전을 사용하고 있으며, 간혹 책이나 튜토리얼을 보게되면

import pxssh 와 같이 선언하는 문구를 보실 수 있습니다.

그러나 위와 같이 선언시 import하지 못해 에러가 발생합니다.

s = pxssh.pxssh()를 통해 변수를 초기화 해 준 뒤 아래의 함수들을 이용하여 로그인 및 커맨드를 실행합니다.

s.login(Domain, ID, Password) - 로그인 관련 메소드로 해당 도메인에 해당 아이디와
 패스워드를 이용해 로그인 합니다.

s.sendline(Command) - 명령어를 실행하는 부분으로 Command에 입력된 명령어를 실행합니다.

s.prompt() - 실행된 명령어의 실행(return되는) 값을 받기 위해 사용합니다.

s.before.decode() - s.before에 실행된 명령어를 가지고 있고, 이를 decode()하여 출력합니다.


위와 같은 코드를 완성하였습니다.

Line 4 - 127.0.0.1 도메인으로 root/123456 으로 로그인을 시도합니다.
(로그인 관련 리턴값을 받아 올 수 있습니다.)
Line 6 - uname -v 명령어를 실행합니다.
Line 8 - 받아온 값을 출력합니다.

실행 결과는 아래와 같습니다.

----------------------------------------------------------------
# python3 pxssh.py 
uname -v
#1 SMP Tue Nov 11 17:57:25 UTC 2014
----------------------------------------------------------------



Python make port scanner(use nmap) #3 - make port scanner (파이썬 포트스캐너 만들기 #3 - port scanner)

앞서 두 과정을 통해 optparse의 사용과 nmap을 설치하였습니다.
이제 파이썬과 nmap 통해 port scanner를 제작 해보도록 하겠습니다.

참조 - 해커의언어, 치명적 파이썬 / TJ오코너

1. optparse 제작

먼저 optparse를 통해 아래와같은 소스를 제작해 보도록 하겠습니다.


-H와 -p -A 옵션을 통해 각각 아래의 기능을 구현합니다.

-H = Host name (ex. 127.0.0.1)
-p = port number (ex. 22)
-A = 직접 명시해 놓은 port (21,22,23,25,42,53,70,79,80,88,110,118,156,161,220,8080)을 스캐닝 합니다.

line 15: 15번 라인을 통해 -H옵션이 없거나 -p나 -A옵션중 하나가 쓰이지 않았다면 프로그램을 종료하도록 처리합니다.

line 19, 22: 19번 라인과 22번 라인을 통해 각 각 -p옵션과 -A옵션을 처리합니다.
-A옵션이 있을 때엔 위에 port변수에 명시한 port들을 scanning하는 분기를 처리하고
-A옵션이 없고 -p옵션이 있을 때에는 -p옵션에 명시한 port들을 scanning하는 분기를 처리합니다.

2. portscanner 제작

nmap을 통해 아래와 같은 함수를 제작해 줍니다.


line 4: 4번 라인을 통해 nmap.PortScanner를 load해 줍니다.
line 5: 5번 라인을 통해 함수 호출때 입력받은 인자(ip주소, 포트넘버)를 load 합니다.
line 6: 6번 라인을 통해 nmScan을 통해 현재 상태 state값을 받아옵니다.
line 7: 7번 라인을 통해 값을 print 해 줍니다.

3. portscanner 완성 및 실행

위에 제작한 1, 2번을 아래와 같이 합쳐줍니다.


27, 32번 line의 if else문도 수정 합니다.


------------------------------------------실행 모습---------------------------------------
# python3 TCPportscanner -H 127.0.0.1 -p 22
 [*] 127.0.0.1 tcp/22 open


# python3 TCPportscanner -H 127.0.0.1 -A
 [*] 127.0.0.1 tcp/21 closed
 [*] 127.0.0.1 tcp/22 open
 [*] 127.0.0.1 tcp/23 open
 [*] 127.0.0.1 tcp/25 closed
 [*] 127.0.0.1 tcp/42 closed
 [*] 127.0.0.1 tcp/53 closed
 [*] 127.0.0.1 tcp/70 closed
 [*] 127.0.0.1 tcp/79 closed
 [*] 127.0.0.1 tcp/80 closed
 [*] 127.0.0.1 tcp/88 closed
 [*] 127.0.0.1 tcp/110 closed
 [*] 127.0.0.1 tcp/118 closed
 [*] 127.0.0.1 tcp/156 closed
 [*] 127.0.0.1 tcp/161 closed
 [*] 127.0.0.1 tcp/220 closed
 [*] 127.0.0.1 tcp/8080 closed


( httpd 80번 포트 서비스 오픈 후 실행)
# service httpd start
Starting httpd: httpd: apr_sockaddr_info_get() failed for 500009674769
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]

# python3 TCPportscanner -H 127.0.0.1 -A
 [*] 127.0.0.1 tcp/21 closed
 [*] 127.0.0.1 tcp/22 open
 [*] 127.0.0.1 tcp/23 open
 [*] 127.0.0.1 tcp/25 closed
 [*] 127.0.0.1 tcp/42 closed
 [*] 127.0.0.1 tcp/53 closed
 [*] 127.0.0.1 tcp/70 closed
 [*] 127.0.0.1 tcp/79 closed
 [*] 127.0.0.1 tcp/80 open
 [*] 127.0.0.1 tcp/88 closed
 [*] 127.0.0.1 tcp/110 closed
 [*] 127.0.0.1 tcp/118 closed
 [*] 127.0.0.1 tcp/156 closed
 [*] 127.0.0.1 tcp/161 closed
 [*] 127.0.0.1 tcp/220 closed
 [*] 127.0.0.1 tcp/8080 closed
------------------------------------------실행 모습---------------------------------------




Python make port scanner(use nmap) #2 - install nmap (파이썬 포트스캐너 만들기 #2 - nmap)

파이썬 포트스캐너 두 번째로 nmap과 nmap 라이브러리를 설치하도록 하겠습니다.

먼저 nmap을 설치하기위해 아래 명령어를 실행합니다.

# yum install -y nmap 

설치가 완료되어지면 아래 명령어를 통해 파이썬용 nmap 라이브러리를 다운받습니다.

# wget http://xael.org/pages/python-nmap-0.4.3.tar.gz 

다운받은 nmap의 압축을 풀어줍니다.

# tar -xvf python-nmap-0.4.3.tar.gz

압축 푼 python-nmap-0.4.3 디렉토리에 들어갑니다.

# cd python-nmap-0.4.3 

아래 명령어를 통해 라이브러리를 install 해줍니다.

# python setup.py install

위 과정을 통해 nmap의 설치화 python에서 nmap을 사용 할 수 있는 라이브러리의
준비가 완료되어집니다.

Python make port scanner(use nmap) #1 - optparse (파이썬 포트스캐너 만들기 #1 - optparse)

파이썬을 이용한 포트스캐너 제작에 앞서 python optparse 모듈에대해 알아보겠습니다.

optparse는 커맨드 라인 프로그램 실행에 이용된 option값을 parsing해주는 모듈입니다.

아래와 같은 커맨드를 가정해 보겠습니다.

python <%program> <%option> <%values>
python optparse.py -f TCPportscanner

위의 커맨드를 통해 program을 실행시킬때 option값을 통해 values를 가져오는 방식입니다.
optparse.py를 실행시킬 때 -f옵션을 통해 filename을 value로 가져오는 방식으로, 프로그램
내에서는 TCPportscanner의 파일명(경로)를 가져오게 됩니다.

아래 소스를 살펴보겠습니다.

line 3: parser = optarse.OptionParser() 를 통해 optparse모듈을 로드합니다.

line 4: parser.add_option()을 통해 받아올 옵션값에대한 정보를 가져옵니다.
a. "-f", "--file"는 사용할 옵션의 형태를 나타냅니다. 이를 통해 프로그램을 실행할 때
<%program> -f <%values>혹은 <%program> --file <%values>형태를 사용 할 수 있습니다.
b. dest="filename"을 통해 이후 변수에 값을 가져올 때 사용 할 도착지 이름입니다.
c. help="File name"을 통해 <%program> -h 명령어를 쳤을 때 불러올 help의 내용을 입력합니다.
d. metavar="FILE"을 통해 meta type을 정의해줍니다.

line 5: parser.add_option()
a. '-p'를 통해 옵션의 형태를 취합니다.
b. dest='port'를 통해 변수에 가져올 도착지 이름을 정합니다.
c. type='int'를 통해 변수의 type을 정의해 줍니다.
d.help=''를 통해 -h명령어에 대한 description을 정의합니다.

line 6: action='store_true', default=False
위 두 옵션은 Flag값을 정의할 때 쓰입니다.
기본적으로 parser.add_options()을 5번 라인과 같은 형태를 취했을 때엔
<%program> -p <%values> 형식으로 사용되어 지지만, flag형태를 취하면
<%program> -a 만으로도 불러 올 수 있고 -a옵션이 활성화되면 Flag가 True로 변하게 됩니다.

즉 action='store_true'를 통해 옵션을 불러왔을때 default=False로 설정되어있던 값을 True로 가져오게 됩니다.

line 8: (options, args) = parser.parse_args()
 parsing한 옵션 값들을 변수로 불러오기 위해 options에 집어넣어줍니다.

line 10, 11, 12: 기본적으로 option을 사용하지 않으면 값에 None가 들어있게 됩니다.
만약 필수 옵션이라면 if문을 통해 그 옵션값이 None일 때, 프로그램을 종료 시킬 수 있습니다.

line 14, 15, 16: 각각 받아온 옵션값을 변수에 저장해 줍니다.

line 18. 19. 20: 각각 받아온 옵션값을 출력합니다.

--------------------------------------------- 실행 모습------------------
# python3 optparse -f TCPportscanner
None
False
TCPportscanner



# python3 optparse -f TCPportscanner -p 22
22
False
TCPportscanner



# python3 optparse -f TCPportscanner -p 22 -a
22
True
TCPportscanner



#python3 optparse -h
Usage: optparse [options]

Options:
  -h, --help            show this help message and exit
  -f FILE, --file=FILE  File name
  -p PORT               input port number

  -a                    flag tuto
--------------------------------------------- 실행 모습------------------

Python socket programming #4 - multiprocessing #1

Python에서 thread는 GIL(Global Interpreter Lock)을 따르게 됩니다.
간단하게 설명하면 보통은 다수의 쓰레드가 작동할 때에 아래와 같은 모델을 상상하게 됩니다.

하지만 GIL에 의해서 python은 한 Thread씩 Lock이 걸리는게 아니라 전체에 걸리게 되면서 여러개의 Thread가 Single Processor에서 동작 하는 것 처럼 동작하게 됩니다.



프로그램을 통해 살펴보면

위는 한 개의 Thread를 동작시켜 총 작업 시간을 출력한 프로그램입니다.
100000000의 숫자를 하나씩 빼면서 while문을 돌리는 간단한 프로그램입니다.
출력 결과는 아래와 같습니다.

---------------------------------------------------
Starting Thread_1
Thread_1 의 작업 시간 8
Exiting Thread_1

Exiting Main Thread
총 작업 시간 8
---------------------------------------------------

또 다른 프로그램을 살펴보면

위는 두 개의 Thread를 동작시켜 총 작업 시간을 출력한 프로그램입니다.
기본적으로 생각했을 때엔 위에서 살펴본 하나의 Thread의 작업 시간인 8초와
동일한 시간을 생각 해 볼 수 있습니다. 하지만 결과는 아래와 같습니다.

---------------------------------------------------
Starting Thread_1
Starting Thread_2
Thread_2 의 작업 시간 15
Exiting Thread_2

Thread_1 의 작업 시간 16
Exiting Thread_1

Exiting Main Thread
총 작업 시간 16
---------------------------------------------------

생각했던 것과는 다르게 하나의 Thread의 작업 시간 8초의 두 배인 16초가 출력 되는 것을 보실 수 있습니다.

위와 같은 이유로 python에서는 thread보단 multiprocessing이 권장되어집니다.

1. Multiprocessing

python에서 사용하는 multiprocessing은 fork()와 같게 생각하시면 됩니다.
하나 이상의 자식 process를 생성하여 이를 병렬구조로 처리하는 것을 지칭합니다.

import multiprocessing
위와같이 모듈을 불러와 사용 할 수 있습니다.

2. Pool

p = Pool(n)
위의 Pool(n)을 통해 미리 process를 생성 할 수 있게 됩니다.

p.map(function, values)
위의 Pool.map을 통해 각 process들이 함수를 동작 시키게 할 수 있습니다.

multiprocessing의 pool을 이용한 예제를 통해 살펴보겠습니다.

위의 예제는 pool을 통해 3개의 process를 생성하고, f(x)함수를 불러와 1초씩 함수에서 대기하게 됩니다. 결론적으로 3개의 process가 10개의 값을 연산하려면 아래와 같이 총 4초가 걸리게 됩니다.

프로세서     값        연산시간      누적 연산시간
process 1 -> 0 -------- 1초  -------- 1초
process 2 -> 1 -------- 1초  -------- 1초
process 3 -> 2 -------- 1초  -------- 1초
------------------------------------------------------
process 1 -> 3 -------- 1초  -------- 2초
process 2 -> 4 -------- 1초  -------- 2초
process 3 -> 5 -------- 1초  -------- 2초
------------------------------------------------------
process 1 -> 6 -------- 1초  -------- 3초
process 2 -> 7 -------- 1초  -------- 3초
process 3 -> 8 -------- 1초  -------- 3초
------------------------------------------------------
process 1 -> 9 -------- 1초  -------- 4초


process를 4개로 늘리거나, range를 (0,9)로 수정한다면 누적 연산시간이 3초가 걸리는 것을
확인 하실 수 있습니다.

아래는 출력 결과입니다.

값 0 에 대한 작업 Pid =  3712
값 1 에 대한 작업 Pid =  3740
값 2 에 대한 작업 Pid =  2568
값 3 에 대한 작업 Pid =  3712
값 4 에 대한 작업 Pid =  3740
값 5 에 대한 작업 Pid =  2568
값 6 에 대한 작업 Pid =  3712
값 7 에 대한 작업 Pid =  3740
값 8 에 대한 작업 Pid =  2568
값 9 에 대한 작업 Pid =  3712
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
총 작업 시간 4

Python socket programming #3 - MultiThreading (Threading module)

2. threading


두 번째로 threading 모듈은 thread 클래스를 상속받아 사용하는 모듈입니다.

클래스가 threading.Thread를 상속받아 사용하게 됩니다.

java와 마찬가지로 run 메소드를 오버라이드 하여 각 각 선언된 클래스를 통해

Class_name.start()를 작동시키면 run 메소드가 작동하게 됩니다.

위의 코드를 보면

class myThread (threading.thread):를 통해 클래스를 선언 한 뒤

생성자를 통해 thread의 name과 delay time을 인자로 받습니다.

이 후 thread1.start()를 통해 run 메소드를 작동시킵니다.

run 메소듣 내부에서는 print_count함수를 호출하여 5회 각 각 1초와 2초의 딜레이를 부여해 내용을 출력합니다.

아래는 출력 내용입니다.

Starting Thread_1
Exiting Main Thread
Starting Thread_2
Thread_1: 5
Thread_2: 5Thread_1: 4

Thread_1: 3
Thread_2: 4
Thread_1: 2
Thread_1: 1
Exiting Thread_1
Thread_2: 3
Thread_2: 2
Thread_2: 1
Exiting Thread_2

Python socket programming #2 - MultiThreading (Thread module)

파이썬에서의 멀티 쓰레딩은 두 가지의 모듈을 사용해 만들 수 있습니다.

각각의 모듈은 아래와 같습니다.


  • Thread
  • Threading


먼저 Thread는 C와 같이 함수를 이용해 Thread를 run 시키는 방식으로 MultiThreading을 구현합니다.

Threading은 흔히 자바에서 보던 방식처럼 Thread관련 클래스를 상속받아 run을 override 하여 사용합니다.

이 포스팅에선 먼저 Thread만 다루도록 하겠습니다.

1. Thread


기본적으로 Thread에서 thread를 run시키는 함수는 아래와 같습니다.

thread.start_new_thread( function, (argument))

아래 소스코드를 확인 해 보겠습니다.

위의 print_num함수에 threadName과 delay인자를 준 뒤

delay 시간만큼 텀을 두고 숫자를 1~5까지 출력하는 함수 입니다.

이 함수를 각 각 1초와 2초로 설정하여 두개의 쓰레드를 작동 시키는 프로그램입니다.

출력값은 synchronizing이 되어있지 않아 값이 겹쳐 나올 수 있게 됩니다.

마지막의 while은 Main Thread를 종료시키게 되면 생성된 2개의 쓰레드도 죽게 되므로

이를 막기위해 Main Thread에 무한루프를 걸어줍니다.

아래는 출력값 입니다.

Thread_1: 1
Thread_2: 1Thread_1: 2

Thread_1: 3
Thread_2: 2
Thread_1: 4
Thread_1: 5
Thread_2: 3
Thread_2: 4
Thread_2: 5

Python socket programming #1 - basic server and client

python의 소켓은 C나 자바에 비해 비교적 단순한 모습을 취하고 있습니다.

Socket의 선언은 아래와 같습니다.

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

여기서 각각 PF(프로토콜 체계)와 AF(주소 체계)를 살펴보면

A. PF

  • PF_INET - IPv4 프로토콜
  • PF_INET6 - IPv6 프로토콜
  • PF_LOCAL - Local 통신 UNIX 프로토콜
B. AF
  • AF_INET - IPv4 프로토콜
  • AF_INET6 - IPv6 프로토콜
  • AF_LOCAL - Local 통신 UNIX 프로토콜
이를 통해 소켓을 만들 때에 사용하고자 하는 프로토콜을 사용할땐 PF를 주소 구조체 안에 주소 체계를 정의할 때엔 AF를 사용합니다.

기본적으로 C에서 socket을 생성 할 때 PF_INET을 사용하지만, Python에는 PF가 없습니다.

그리고 뒤에오는 SOCK_STREAM과 SOCK_DGRAM을 통해 각 각 TCP UDP를 결정하게 됩니다.


Socket에 대한 binding은 아래와 같이 선언합니다.

s.bind((host, port))

위와 같이 소켓 선언과 바인딩이 타 언어에 비해 아주 심플한 모습을 취하고 있습니다.

소켓을 통해 간단하게 값을 한 번만 주고 받는 에코서버를 작성해보도록 하겠습니다.

1. Server


서버에서 원격지의 소켓을 받기 위한 listen은 아래와 같이 선언합니다. 이 부분은 C의 서버 프로그래밍과 유사합니다.

s.listen(5)

listen을 통해 소켓이 개통이 되는데 뒤의 인자 backlog는 커널이 관리하는 대기 큐에서
연결 요청을 하고 기다리는 총 클라이언트의 수 입니다.

위 큐에 연결 요청한 소켓은 SYN_RCVD나 ESTABLISHED 상태로 대기합니다. 이 함수를 호

출하면 커널은 내부적으로 소켓의 상태를 CLOSED에서 LISTEN으로 바꿔줍니다.

Status

  • SYN_RCVD - 클라이언트가 connect 함수로 서버에 요청한 연결을 처리하기 위해 SYN 패킷을 통한 3-Way Handshaking을 진행하는 중입니다.
  • ESTABLISHED - 3-Way Handshaking이 모두 완료되면 이 상태가 됩니다.

마지막으로 클라이언트의 연결을 위한 accept 함수는 아래와 같습니다.

c = s.accept()

위를통해 클라이언트 소켓을 Accept 할 수 있습니다.

이제 send와 recv를 통해 값을 주고 받을 수 있습니다.

socket.send("connect success")

socket.recv(1024)

서버 소스는 아래와 같습니다.


먼저 socket.socket()를 통해 소켓을 생성 한 뒤

9999번 포트의 루프백 ip 127.0.0.1로 bind 해줍니다.

s.listen(5)와 s.accept()를 통해 클라이언트 소켓을 연결 한 뒤

send를 통해 'Connection success'를 전송 해 줍니다.

클라이언트가 들어오기 전 c, addr = s.accept()에서 대기중인 실행 모습은 아래와 같습니다.

listen ok


2. Client


Client 또한 마찬가지로 socket.socket()를 통해 소켓을 생성 해 줍니다.

그리고 아래와 같이 connect() 함수를 통해 해당 ip 127.0.0.1과 9999번 포트에 소켓을 연결 해 줍니다.

s.connect((host, port))

그리고 recv를 통해 상대방의 send를 기다립니다.

s.recv(1024)

서버와 클라이언트의 실행 결과는 아래와 같습니다.

-----------------------Server-----------------------
listen ok
connection ('127.0.0.1', 2617)
-----------------------Client------------------------
Connection success
-----------------------------------------------------

python - Reading Excel sheet with xlrd (xlrd를 이용한 파이썬 엑셀 파일 읽기)

1. xlrd

시작에 앞서 python xlrd패키지를 설치해야 합니다.
https://pypi.python.org/pypi/xlrd/0.7.9

xlrd와 xlwd 두개의 패키지가 존재하는데, xlrd는 read용 패키지 xlwd는 write용 패키지 입니다.

먼저 포스팅에 사용할 엑셀 Sheet은 아래와 같이 작성됐습니다.

Sheet1

Sheet2









2. Open the Excel files and sheets


위와 같이 xlrd를 import 해줍니다.

Lien 4 - xlrd.open_workbook()을 통해 Excel파일을 읽어옵니다.

Line 5, 13  - sheet_by_index()를 통해 line 5에선 Sheet1 line 13에선 Sheet2를 각각 열람 할 수 있습니다.

Line 6 - ncols를 통해 열람한 Sheet의 컬럼의 갯수를 확인 할 수 있습니다.

Line 7 - nrows를 통해 열람한 Sheet의 로우의 갯수를 확인 할 수 있습니다.

출력결과 아래와 같습니다.

-------- Sheet1 --------
Number of col: 4
Number of low: 4
-------- Sheet2 --------
Number of col: 2
Number of low: 2

3. Get values in excel file


row_values와 col_values를 통해 각 각 row와 col의 값을 구할 수 있습니다.

row_values(0)을 이용하면 엑셀의 1번 줄 [1A, 1B, 1C, 1D]를 출력 할 수 있습니다.

col_values(0)을 이용하면 엑셀의 A컬럼 [1A, 2A, 3A, 4A]를 출력 할 수 있습니다.

출력결과 아래와 같습니다.

-------- Sheet1 --------
Number of col: 4
Number of low: 4
-------- Values of low --------
[u'1A', u'1B', u'1C', u'1D']
[u'2A', u'2B', u'2C', u'2D']
[u'3A', u'3B', u'3C', u'3D']
[u'4A', u'4B', u'4C', u'4D']
-------- Values of col --------
[u'1A', u'2A', u'3A', u'4A']
[u'1B', u'2B', u'3B', u'4B']
[u'1C', u'2C', u'3C', u'4C']
[u'1D', u'2D', u'3D', u'4D']


4. values are saved the list


row_values(0)이 [1A, 1B, 1C, 1D]의 정보를 가지고 있습니다.

결론적으로 1A만 불러오려면 row_values(0)[0]을 이용하면 1A만 출력 할 수 있습니다.

이를 통해 Python의 list에 엑셀파일의 모든 컬럼이 가지고있는 값을 저장 할 수 있습니다.

출력결과 아래와 같습니다.

-------- Sheet1 --------
Number of col: 4
Number of low: 4
-------- Values of Excel file --------
['1A', '1B', '1C', '1D']
['2A', '2B', '2C', '2D']
['3A', '3B', '3C', '3D']
['4A', '4B', '4C', '4D']

Eclipse Python 개발 환경 구축

이클립스를 실행 시킨 뒤 help -> Eclipse Marketplace를 실행 시켜 PyDev로 검색 한 뒤 PyDev를 설치 해 줍니다.


위와 같은 페이지가 나오면 I accept the terms of the license agreements를 체크 해 준 뒤 Finish를 눌러줍니다.


위와 같이 Install이 진행됩니다.


Install 중 위와 같은 페이지가 나오면 Brainwy Software; PvDev; Brainwy에 체크 해 준 뒤 OK를 눌러줍니다.


설치가 완료되면 이클립스를 reboot한 뒤 window -> preferences를 실행 해 줍니다.
그 후 PyDev -> Interpreters -> Python Interpreter를 선택 한 뒤 오른쪽 상단에 New를 클릭해 파이썬이 설치된 폴더에서 python.exe를 선택 해 줍니다.


위와 같이 추가되어 집니다.



위와같이 Python 프로젝트를 생성 할 수 있습니다.



테스트 화면입니다.