컴퓨터 세계에서 자주 사용되는 json이라는 표준이다. json은 Python을 자주 사용하는 사람이라면 아는 dictionary이라는 자료구조와 유사하게 생겼는데, 광범위하게 데이터 오브젝트를 인간이 읽을 수 있는 상태에서 전달하기 위한 표준이다. 다음은 json의 예시이다.

{
    "file_format_version" : "1.0.0",
    "ICD": {
        "library_path": ".\\XXX.dll",
        "api_version": "1.0.3"
    }
}

// json파일의 예시



json처럼 객체를 저장하고 나중에 재구성할 수 있는 포맷으로 표기하는것을 직렬화(Seriallization), 그 데이터를 다시 불러오는 것을 역직렬화(Deseriallization)이라고 한다. Python은 json처럼 인간 읽을 수 있는 방식 말고 pickle이라는 모듈을 이용해서 바이트 수준의 직렬화를 제공한다.



pickle을 이용한 데이터의 저장


다음은 students LIST객체를 my_list.dump에 저장하는 예시이다. byte연산을 수행하는 만큼 파일모드를 wb로 열었다.

>>> import pickle
>>> students = ["CHEEL","GLAADOS","STEENLY"]
>>> with open("my_list.dump","wb") as f:
	pickle.dump(students,f)

>>> b_students = pickle.dumps(students)
>>> print(b_students)
b'\x80\x04\x95!\x00\x00\x00\x00\x00\x00\x00]\x94(\x8c\x05CHEEL\x94\x8c\x07GLAADOS\x94\x8c\x07STEENLY\x94e.'


* b_students처럼 저장하는 대신 pickle.dumps(students)로 바이트 반환받을 수 있다.

 



pickle을 이용한 데이터의 불러오기


다음은 my_list.dump에 저장된 바이트스트림을 students에 다시 할당하는 코드이다. 역시 rb로 열었다.

>>> import pickle
>>> with open("my_list.dump","rb") as f:
	new_students = pickle.load(f)

>>> print(new_students)
['CHEEL', 'GLAADOS', 'STEENLY']
>>> new_b_students = pickle.loads(b_students)
>>> print(new_b_students)
['CHEEL', 'GLAADOS', 'STEENLY']


* 역시 pickle.loads(datas)로 파일연산없이 직접 받을 수 있다.



* pickle불가한 객체를 pickle 하면 PicklingError라는 Exception이 발생한다. 가능한 객체 목록은 API를 참조하자
* 클래스 인스턴스를 pickle하는 방법이 API에 나와있다. __init__()이 호출되는 것이 아닌, 기존의 attribute를 저장했다가 load 하는 방식인데, 사용자가 재정의할 수 있다는 점에서 재미있는 이야기이니, API를 한 번씩 읽어보기를 바란다.
* 과거에는 pickle과 비슷한 marshal이라는 모듈이 있었다고한다.(안써봤다.) API에서는 여러 가지 이유로 marshal대신 pickle을 쓰기를 권장한다.

 

* 출처 : docs.python.org/ko/3/library/pickle.html

 

pickle — 파이썬 객체 직렬화 — Python 3.9.4 문서

pickle — 파이썬 객체 직렬화 소스 코드: Lib/pickle.py pickle 모듈은 파이썬 객체 구조의 직렬화와 역 직렬화를 위한 바이너리 프로토콜을 구현합니다. 《피클링(pickling)》은 파이썬 객체 계층 구조가

docs.python.org



이번시간에는 Python의 직렬화 / 역직렬화 방식인 pickle에 대해서 알아보았다. 거대한 데이터를 저장하거나, 변수의 프로그램 수명에서 재사용할 시 채용할 수 있는 기법이니, 익혀두면 도움이 될 것이다.

혹시 이 글을 읽는 독자는 LIST의 복사를 시도해보았는가? 아마 a=[1,2,3]과 같은 LIST를 바로 b=a로 복사부터 시도했을 가능성이 크다(우리 Python은 직관적이어서 이거도 돼야 되는 거 아닌가?) 웃긴 건 이때 a [0]=5를 하면 b도 [5,2,3]이 된다는 점이다. 이는 복사의 깊이가 달라서 생기는 문제이다.

 


복사의 구분

복사는 수준에 따라 다음과 같이 구분된다.

① 얕은 복사(Shallow copy) : 메모리 주소만 같은 곳을 가리키게 복사되는것, 값이 복사되는 것은 아니다.
② 깊은 복사(Deep copy) : 실제 값까지 모두 복사되는 것

 

Python은 모듈 copy를 통해서 이 복사행위를 다룬다. 다음은 두 가지는 copy모듈이 제공하는 함수이다.

1. copy.copy(x) : x의 얕은 복사결과를 반환

2. copy.deepcopy(x) : x의 깊은 복사결과를 반환

 

다음은 예시이다.

>>> import copy
>>> a=[[1,2,3,4,5],[6,7,8,9]]
>>> b = copy.copy(a)
>>> a[1].append(10)
>>> print(b)
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
>>> b = copy.deepcopy(a)
>>> a[1].append(11)
>>> print(b)
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]

다음과 같이 얕은복사로 이루어진 copy.copy는 원본의 추가 연산이 복사본에도 영향이 가고, 깊은 복사가 실행된 이후에는 원본의 변화가 복사본에 영향을 미치지 않는 것을 확인할 수 있다.


이번 모듈탐구 시간에는 복사를 용이하게 도와주는 copy모듈에 대해서 알아보았다. 비록 list를 예시로 들었지만, 다른 자료구조(Dict, tuple 등)이나 객체에도 해당되는 이야기이니, 유용하게 사용하기를 바란다.

base64라는 인코딩 방식을 들어본 적이 있는가? 컴퓨터 분야에서 상당히 많이 쓰이는 인코딩 방식이넫, 이진 파일들을 문자 코드에 영향을 받지 않는 64개의 ASCII를 사용하여 일련의 문자열로 변환하는 인코딩 방식이다. 이와 비슷하게 base32, base 16 방식도 존재하고, ASCII 문자 자체가 128개가 되지 않기 때문에 base128은 없는 방식이다.(대신 귀 여운 8 5를준 비했습니다.) 특수한 규약으로는 base64로 인코딩 된 문자는 = 혹은 ==으로 끝이난 다는 점이다. 모듈 탐구 시간, 오늘은 이 base인코딩을 다루는 base64 모듈을 알아보도록 하자


base64모듈에서 사용되는 함수들은 전부 base64 클래스의 클래스 함수이다.

 

부호기 - ENCODER

1. base64.b64encode(s) : 바이트 객체 s를 받아 인코딩 된 byte를 반환한다.

2. base64.standard_b64encode(s) : 바이트 객체 s를 받아 표준 base64알파벡으로 인코딩 된 byte를 반환한다.

3. base64.urlsafe_b64encode(s) : 바이트 객체 s를 받아 url에서 사용 가능한 base64인 코딩된 byte를 반환한다.

4. base64.b32encode(s) : 바이트 객체 s를 받아 base32로 인코딩 된 byte를 반환한다.

5. base64.b16encode(s) : 바이트 객체 s를 받아 base 16으로 인코딩 된 byte를 반환한다.

6. base64.a85encode(s) : 바이트 객체 s를 받아 Ascii85를 사용해 인코딩 된 byte를 반환한다.

7. base64.b85encode(s) : 바이트 객체 s를 받아 base85를 사용해 인코딩 된 byte를 반환한다.

8. base64.encode(input,output) : input, output은 file객체여야 한다. input의 내용을 base64로 인코딩하여 output에 쓴다.

9. base64.encodebytes(s) : 바이트객체 s를 받아 base64로 인코딩하고, 76바이트마다 개행(b"\n")을 포함하여 결과를 반환한다.

 

복호기 - DECODER

1. base64.b64decode(s) : 바이트 객체 s를 받아 인코딩 된 byte를 반환한다.

2. base64.standard_b64decode(s) : 바이트 객체 s를 받아 표준 base64알파벡으로 인코딩 된 byte를 반환한다.

3. base64.urlsafe_b64decode(s) : 바이트 객체 s를 받아 url에서 사용 가능한 base64인 코딩된 byte를 반환한다.

4. base64.b32decode(s) : 바이트 객체 s를 받아 base32로 인코딩 된 byte를 반환한다.

5. base64.b16decode(s) : 바이트 객체 s를 받아 base 16으로 인코딩 된 byte를 반환한다.

6. base64.a85decode(s) : 바이트 객체 s를 받아 Ascii85를 사용해 인코딩 된 byte를 반환한다.

7. base64.b85decode(s) : 바이트 객체 s를 받아 base85를 사용해 인코딩 된 byte를 반환한다.

8. base64.decode(input,output) : input, output은 file객체여야 한다. input의 내용을 base64로 인코딩하여 output에 쓴다.

9. base64.decodebytes(s) : 바이트객체 s를 받아 base64로 인코딩하고, 76바이트마다 개행(b"\n")을 포함하여 결과를 반환한다.

 

코드 예시

base64.encode, base64.decode를 제외한 모든 코드의 사용이 동일하여 일반 문자열 strs가 base64로 encode > decode 되는 순서의 예시를 첨부한다.

>>> import base64
>>> strs = "나의 문자열 썸띵입니다,"
>>> strs = strs.encode()
>>> strs
b'\xeb\x82\x98\xec\x9d\x98 \xeb\xac\xb8\xec\x9e\x90\xec\x97\xb4 \xec\x8d\xb8\xeb\x9d\xb5\xec\x9e\x85\xeb\x8b\x88\xeb\x8b\xa4,'
>>> en = base64.b64encode(strs)
>>> print(en)
b'64KY7J2YIOusuOyekOyXtCDsjbjrnbXsnoXri4jri6Qs'
>>> de = base64.b64decode(en)
>>> print(de)
b'\xeb\x82\x98\xec\x9d\x98 \xeb\xac\xb8\xec\x9e\x90\xec\x97\xb4 \xec\x8d\xb8\xeb\x9d\xb5\xec\x9e\x85\xeb\x8b\x88\xeb\x8b\xa4,'

* 출처 : docs.python.org/ko/3/library/base64.html

 

base64 — Base16, Base32, Base64, Base85 데이터 인코딩 — Python 3.9.4 문서

base64 — Base16, Base32, Base64, Base85 데이터 인코딩 소스 코드: Lib/base64.py 이 모듈은 바이너리 데이터를 인쇄 가능한 ASCII 문자로 인코딩하고 이러한 인코딩을 다시 바이너리 데이터로 디코딩하는 함

docs.python.org


컴퓨터세상에 발을 들였으면, 인코딩 타입은 어느 분야에서든(DB, NETWORK, 웹 등등 진짜 어디서든) 사용된다. 그중 표준 인코딩 타입처럼 많이 사용되는 것이 base64이다. 이 모듈을 자유자재로 다룰 줄 알게 되면, 다른 분야에서 python을 사용하는 데에 많은 도움이 될 것이라고 확신한다.

2번째 모듈 탐구 이번 살펴볼 모듈은 random이다. 사실 random을 컴퓨터에서 완전히 구현하는 것은 불가하다고 본다. 일정수의 주기를 가지고 생성하는 유사 난수 생성기(PRING)로 난수를 생성하게 되는데, 이 난수를 더욱 잘 처리할 수 있게 도와주는 모듈이 random 모듈이다.


일단 random모듈에서 제공하는 함수는 Random 클래스에 정의된 클래스 메서드 이다.(random 모듈에서 제공하는 클래스는 random과 systemrandom 2가지이다.) 그중 대부분의 함수는 다음의 random.random()이라는 [0, 1.0) 사이 무작위 float를 반환하는 기본 함수에 의존한다.

 

난수 생성기를 관리하는 함수

random.seed(a=None) : 난수 생성기는 무엇을 기준으로 난수를 생성할지 기준(Seed값)을 가지게 된다. seed함수는 이 기준값을 초기화 하주며, None으로 정의될 경우 현재의 시스템 시간이 seed로 사용된다.

 

* 난수생성기의난수 생성기의 현재 상태는 getstate()로 구할 수 있고, setstate()로 설정할 수도 있다.(이를 이용하여 난수 생성기의 당시 상태를 저장, 불러올 수 있다.)

 

난수 생성기의 생성 함수

1. random.randbytes(n) : n자리의 무작의 byte를 생성한다/

2. random.randrange(start, stop, step) : range(start, stop, step)중 임의로 선택된 요소를 반환한다. 만약 파라미터가 1개가 주어지면 range(parameter)에서 무작위로 선택한다.

3. random.randint(a, b) : a <=N <=b에 부합하는 임의의 N을 반환한다.

4. random.getrandbits(k) : k bit로 이루어진 양의 정수를 반환한다.

5. random.random() : [0.0, 1.0)의 구간에서 임의의 부동 소수점 숫자를 반환한다.

6. random.uniform(a, b) : a <=N <=b에 부합하는 임의의 부동소수점 N을 반환한다.(b> a인 경우 반대로)

>>> import random
>>> random.randbytes(3)
b'\x81\xebA'
>>> random.randrange(0,10)
2
>>> random.randint(0,10)
7
>>> random.getrandbits(3)
7
>>> random.random()
0.3533718176197945
>>> random.uniform(3,5)
3.3321894552898152

 

난수 생성기의 시퀀스 처리 함수

1. random.choice(seq) : 비어있지 않은 seq에서 임의의 요소를 반환한다.

2. random.choices(population, k=n) : population에서 중복을 허락하며 길이가 k인 list를 반환한다.

3.. random.sample(population, k) : population에서 중복을 허락하지 않고 길이가 k인 list를 반환한다. 

4. random.shuffle(seq) : seq를 섞습니다.

>>> import random
>>> a=[1,2,3,4,5,6,7,8,9,10]
>>> random.choice(a)
7
>>> random.choices(a,k=5)
[2, 10, 5, 7, 5]
>>> random.sample(a,5)
[9, 6, 5, 8, 3]
>>> random.shuffle(a)
>>> a
[7, 8, 4, 1, 3, 2, 9, 5, 6, 10]

 

* Python은 메르센 트위스터(Mersenne Twister)라는 난수 생성기를 사용한다. 이는 53비트의 정밀도와 2**19937-1의 주기를 가지는데(총각 그게 좋은 거유~?) 혹시나 자신만의 난수 생성기를 사용할 사람은 random클래스를 상속받아서 쓰라고 API에 쓰여있다.

* random모듈의 실수 반환 랜덤은 수학적인 radom함수를 다수 가지고 있다. 필자는 수학을 못해서 넘어갔지만, 공학도 분들께서는 gauss, expovariate, gammavariate, weibullvariate(아니 영어도 무슨 뜻인지 모르겠다.)등을 보고 사용하도록 하자

 

* 출처 : docs.python.org/ko/3/library/random.html

 

random — 의사 난수 생성 — Python 3.9.4 문서

random — 의사 난수 생성 소스 코드: Lib/random.py 이 모듈은 다양한 분포에 대한 의사 난수 생성기를 구현합니다. 정수에 대해서는, 범위에서 균일한 선택이 있습니다. 시퀀스에 대해서는, 무작위

docs.python.org


'm번모시았알을 d. 간 o 다이는 nr보 a아듈'

다음 시간은 다른 모듈 탐구 포스팅으로 여러분들을 찾아뵙겠다.

모듈 탐구 그 첫 번째 시간 time 함수이다. 사실 필자는 time 모듈을 사용하면서 sleep함수나 strptime 등 쓰던 함수만 쓰는 일이 다수 있지만.... 이번 기회에 time 모듈을 조금 공부하면서 아는 지식을 정리하고자 한다.


일단 용어를 정리하고 가야한다.

* 에포크(epoch) : 시간이 시작되는 시점(태초에 만물이 있을 지어니...) 플랫폼에 따라 다른데 예를 들면 유닉스는 1970년 1월 1일 00:00:00(UTC)이다. time.gmtime(0)로 알아볼 수 있다.

* UTC : 협정 세계시로, 그리니치 표준시인 GMT로 알려져 있다.

* DST : 일광 절약 시간으로 일 년 중 일부 기간 시간대를 한 시간 조정하는(서머타임)이다. 

 

먼저 에포크 이후의 시간은 time.time()으로 구할 수 있다. time.time()은 에포크 이후의 초를 나타내는 시간을 부동 소수점 숫자로 표현(뒤에 ns를 붙여서 정수로 나노초 반환 가능)한다.

>>> import time
>>> time.time()
1618071662.5779314
>>> time.time_ns()
1618071676597228800

 

클래스 : struct_time

time 모듈에 정의되며 자주 사용되는 객체는 struct_time이라는 객체이다.

이 struct_time은 다음과 같은 어트리뷰트를 가진다.

1. tm_year : 예를 들면 1998, 연도를 가리킨다.

2. tm_mon : 1-12의 달을 가리킨다.

3. tm_mday : 1-31의 달에 있을 수 있는 일자를 가리킨다.

4. tm_hour : 0-23의 시간을 가리킨다.

5. tm_min : 0-59의 분을 가리킨다.

6. tm_sec : 0-61의 초를 가리킨다.(?? 왜 61초이지?)

7. tm_yday : 1-366의 연에 있을 수 있는 일을 가리킨다.(아마 윤달 계산한 듯)

8. tm_isdst : 0,1,-1의 값을 가진다. 일광 절약 시간제가 발효 중인 경우 1 아니면 0, 모르면 -1

9. tm_zone : 시간대 이름의 약어, 필수는 아니다.

10. tm_gmtoff : UTC에서 동쪽으로 초 단위 오프셋, 필수는 아니다.

 

struct_time을 반환하는 함수

1. time.gmtime() : 에포크 이후의 초단위 시간을 tm_isdst가 0인 UTC로 반환한다.

2. time.localtime() : gmtime()과 같으나, 현지시각으로 변환한다.

3. time.strptime(Stirng) : 문자열로 시간을 맡아서 이걸 struct_time으로 반환한다.

>>> import time
>>> time.gmtime()
time.struct_time(tm_year=2021, tm_mon=4, tm_mday=10, tm_hour=16, tm_min=22, tm_sec=27, tm_wday=5, tm_yday=100, tm_isdst=0)
>>> time.localtime()
time.struct_time(tm_year=2021, tm_mon=4, tm_mday=11, tm_hour=1, tm_min=22, tm_sec=31, tm_wday=6, tm_yday=101, tm_isdst=0)
>>> time.strptime("11 Apr 2021","%d %b %Y")
time.struct_time(tm_year=2021, tm_mon=4, tm_mday=11, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=101, tm_isdst=-1)

 

struct_time → 부동소수점 실수

1. time.mktime(t) : struct_time자료형의 t를 받아들여 초를 부동소수점으로 반환한다.

>>> import time
>>> cur=time.localtime()
>>> time.mktime(cur)
1618071881.0

 

혹은 이 struct_time을 이쁜 말로 변경할 수도 있다.

1. time.asctime(t) : struct_time자료형의 t를 받아들여 ex : 'Sat Apr 10 15:42:41 2021'로 표현한다.

* 유사 함수로 time.ctime()이 있는데, 에포크 이후 초로 표현된 시간을 현지 시간으로 보인다.

2. time.strftime(format, t) : struct_time자료형을 받아들여 아래와 같은 규약으로 문자열을 생성한다.

지시자 의미
%a, %A 약식 요일, 전체 요일
%b, %B 약식 월, 전체 월
%c 적절한 날짜와 시간
%d 월중 일을 십진수(01~31)로 표현
%H, %I 각각 24, 12시간을 십진수로
%J 연중 일(001~366)을 십진수로
%m, %M 월, 분을 십진수로
%P AM, PM에 해당하는 시간값
%S 초를 십진수로
%U 연중 주번호를 십진수로(0~53)
%w 요일을 십진수로(0[일요일] ~ 6)

 

time모듈을 이용한 프로세스 실행시간의 측정

1. time.process_time() : 프로세스의 실행시간을 부동소수점 실수로 반환한다.(time.sleep으로 스킵된 시간 제외)

2. time.monotonic() : 단조 증가 시간을 부동소수점 실수로 반환한다.

3. time.perf_counter() : 프로세스의 실행시간을 부동소수점 실수로 반환한다.(time.sleep으로 스킵된 시간 포함)

* 위 함수들은 환경마다 달라지기에, 2번 호출하여 비교하는 것이 올바르다.

* 위 함수들은 뒤에 _ns를 붙여 정수의 나노초를 반환할 수 있다, ex : time.process_time_ns()

 

프로그램의 정지

Python 멈춰! 를 구현할 수 있는 time.sleep() 함수이다. time.sleep()은 아래 코드와 같이 사용되며, 호출하는 스레드를 일시 중단하는 기능을 가지고 있다.

import time
print("Python 멈춰!")
time.sleep(3)
print("3초후, 넌 이미 출력되어있다.")

위 코드의 2번째 print는 3초 후에 출력된다.

 

 

 

* time모듈에는 이 외에도 스레드의 시간을 스레드 별로 측정하게 도와주는 clock_XX함수가 있다. 궁금한 사람들은 다음의 API를 읽어보기를 바란다.

* 출처 : docs.python.org/ko/3/library/time.html

 

time — 시간 액세스와 변환 — Python 3.9.4 문서

time — 시간 액세스와 변환 이 모듈은 다양한 시간 관련 함수를 제공합니다. 관련 기능에 대해서는, datetime과 calendar 모듈도 참조하십시오. 이 모듈을 항상 사용할 수 있지만, 모든 플랫폼에서 모

docs.python.org

 


python에서 프로그램 실행시간을 측정하고, 시간에 관련된 함수와 구조체를 제공하며, 프로그램의 정지까지 제공하는 time모듈에 대해서 알아보았다. "에에? 시간에 관련해서는 datetime이 더 세련된 모듈 아닌가요><??" 모르는 소리, datetime 또한 import time as _time으로 구현되며 시작한다. 이로써 프로그램에서 우리의 시간을 다루는 능력이 더욱 향상되었기를 바란다. 

Python은 정말 어마어마한 사용자가 있다. 보통의 경우 우리가 "와 이런 함수를 만들어야겠다!"라고 생각한 건 이미 만들어져 있다고 보면 된다.  물론 이런 것들이 Python을 설치했을 때 기본적으로 들어와 있는 것들도 있지만, 인터넷에 올라가 있기에 다운로드하여야 되는 것들도 있다. 이렇게 정의되어 우리가 사용할 수 있는 친구들을 모듈(module)이라고 부르는데 이번 시간에는 모듈 사용으로 사전에 다른 곳에 정의된 함수를 사용하는 방법에 대해서 간단하게 알아보자


모듈의 사용법

우리를 도와줄 모듈은 os라는 모듈이다. 우리의 개발 콘솔에 다음과 같은 명령어를 입력하자

>> import os

os라는 모듈은 시스템의 작업을 도와주는 역할을 한다. (파일 시스템 작업이란 파일의 이동 / 복사 / 삭제 및 현재 작업 경로의 파악과 변경 등의 일을 말한다. os에 내장된 기능은 훨씬 많지만, 복잡한 기능은 오히려 다른 모듈이 잘 구현되어 있는 경우가 많다.)

 

모듈을 import 했으면 끝이다...

??? 이게?

맞다 사용하기만 하면된다. 파이선은 이렇게 간단하게 모듈을 사용할 수 있다. 

 

지금은 이해하기 어렵겠지만 os모듈에서 가져온 함수들은 os에 속한 함수를 사용한다는 의미로 앞에 os. 을 붙여야 한다.

다음의 예시를 보자

>> import os
>> os.getcwd()
'C:\\Users\\[사용자명]\\AppData\\Local\\Programs\\Python\\Python38'
## os.getcwd()는 현재 작업환경이 어디에 있는지를 문자열로 반환한다.
## 이 경로는 당연히 사용자마다 다르다.

>> from os import *
## 위와같은 방법으로 함수사용에 앞 os.을 생략할 수 있다. import 예약어는 "사용하겠다"이고 
## from 예약어는 당연히 "어디에서 가져온"을 의미하기에 명시적으로 from os 를 하면 함수명만으로 
## 아래처럼 사용할 수 있다. 모듈이 많아지면 많아질수록 헷갈리기에 선택적으로 잘 사용해야된다.
>> getcwd()
'C:\\Users\\[사용자명]\\AppData\\Local\\Programs\\Python\\Python38'

* 아래처럼 from으로 위치를 정해주면 os. 를 생략할 수 있다는 것도 알아두면 좋다.

 

이렇게 바로 가져올 수 있는 모듈은 Python이 설치될 때 기본적으로 들어있는 모듈(built-in module)들로 자신의 Python설치경로 Lib(라이브러리의 약자다) 폴더에 정의되어있다. 이 외에도 다른 사람들이 만든 모듈의 자신의 Python환경에서 사용할 수 있는 방법 또한 당연히 존재한다.

 

 

외부 라이브러리 가져오기 - pip

pip( Pip installs Packages or Pip Installs Python" 재밌는 이야기 해줄까요? pip는 약자는 pip가 들어가요 히히히히힣) 우리 환경에 패키지(일련의 코드나 폴더들의 집합체)를 설치하고 관리해주는 도구이다. 리눅스를 사용하는 사람이라면 Python버전의 apt-get이나 dpkg라고 생각해주시면 되겠다. pip에 관한 자세한 설명은 별도의 포스팅에서 하는 것을 하고(훌륭한 프로그램이라 사용법을 조금 집중해서 설명하고 싶다.) 바로 라이브러리를 한번 가져와보자

 

환경변수 설정 후 pip로 모듈 가져오기

* 환경변수 세팅이 끝나 있는 사람은 만 보면 된다.

* 본 설명은 Window를 기준으로 되어있다.

① [윈도 키] + [Pause Break]로 컴퓨터 설정으로 들어와서 [고급 시스템 설정] - 환경변수를 선택한다.

② 시스템 변수[S]의 PATH를 편집하여 [새로 만들기]로 설치한 Python경로의 scripts 폴더를 넣어주면 끝!

* 자신이 Python을 어따설치한지 모르는 분들을 위해 : Python 3.X 사용자는 사용자 폴더 아래 있는 appdata\local\programs 아래, Python 2.X 사용자는 C아래의 Programs Files(X86), anaconda사용자는 anaconda 설치경로 아래 anaconda3/bin에 pip가 있다.

 

③ 명령 프롬포트(cmd)를 실행하고 다음의 코드를 입력하자

* Python2 사용자의 경우 pip3가 아닌 pip를 사용하시면 되겠다.

C:\> pip3 install requests

에러 없이 정상적으로 설치가 되었다면 아까 확인한 Lib(라이브러리) 안 site-package폴더 아래 requests 관련된 패키지가 설치된 것을 확인할 수 있을 것이다. 이럴 것도 없이 Python 개발 콘솔에 import requests를 입력해서 에러가 없으면 끝이다.

 

 

모듈의 순서와 유효 범위

당연하게도 아무 데나 둔다고 import 할 수 있는 것은 아니다. Python은 다음의 순서로 import를 시도한다.

① sys.modules(이미 import 된 모듈을 dictionary로 관리)

② built-in modules(Python에서 제공하는 공식 라이브러리)

③ sys.path

 

①과 ③은 sys라는 모듈을 import 해서 확인할 수 있다.

>> import sys
>> sys.modules
## 보통 이거 조금 길다 예시는 생략한다.

>> sys.path
## 이건 환경변수 PATH값을 가져온다.

 

내가 만든 함수도 모듈로 물론 import 할 수 있다. 다음과 같은 a.py를 만들고 같은 폴더에서 b.py를 작업하고 있다고 하자

## a.py ##
def some_function() :
    print("a에서 실행된 파일입니다.")

 

코드 : 
## b.py ##
import a
a.some_function()

출력 :
"a에서 실행된 파일입니다."

이런 식으로 말이다. 


이번 시간에는 모듈의 사용방법을 알아보았다 이제 다른 사람이 작성한 훌륭한 코드들을 루팡 할 수 있게 되었다. 자유자재로 사용할 수 있게 된 것이다. Python에는 너무나도 훌륭한 모듈이 많기에 친해지기 강의가 끝나면 모듈별로 알아보는 module 집중탐구 시간을 가지고자 한다. 다음 시간에는 파일 입출력에 대해서 알아보도록 하자

+ Recent posts