{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "***\n", "# 17. 파이썬 모듈\n", "***\n", "***" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "## 1 이름 공간\n", "***\n", "- 이름 공간 또는 스코프 (Naming Space or Scope): 이름이 존재하는 장소. 파이썬은 실행 시간에 각 이름들을 적절한 이름 공간에 넣어 관리한다.\n", "- 이름 공간(스코프)의 종류\n", " - 지역(Local): 각 함수 내부\n", " - 전역(Global): 모듈 (파일) 내부\n", " - 내장(Built-in): 파이썬 언어 자체에서 정의한 영역\n", "- 변수가 정의되는 위치에 의해 변수의 스코프가 정해짐\n", " - 파이썬에서 변수의 정의\n", " - 변수가 l-value로 사용될 때\n", "- 변수가 r-value로 사용될 때 해당 변수의 값을 찾는 순서 규칙\n", " - L --> G --> B" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![image](../images/scoping_rule.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1-1 지역변수와 전역변수\n", "- 변수의 스코프는 해당 변수가 l-value로서 정의되는 위치에 따라 달라짐\n", "- 변수가 함수 내에서 정의되면 해당 함수의 지역 변수가 된다." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "30\n", "5\n" ] } ], "source": [ "# g, h는 전역 변수\n", "g = 10\n", "h = 5\n", "\n", "def f(a): # a는 지역 변수\n", " h = a + 10 # h는 지역, 새로 l-value로 정의했음\n", " b = h + a + g # b도 지역, g는 r-value이므로 기존 값을 참조 - 전역 변수\n", " return b\n", "\n", "print(f(h)) # 함수 호출시에 사용되는 변수는 해당 위치의 스코프에서 값을 찾음 - 전역 변수\n", "print(h) # 전역 변수 h는 변함 없음" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 함수 내부에서 전역 변수를 직접 사용하고자 할 때\n", " - global 키워드 활용" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "20\n", "20\n" ] } ], "source": [ "h = 5\n", "\n", "def f(a): # a는 지역\n", " global h # h 변수를 전역이라고 미리 선언함\n", " h = a + 10 # h는 l-value로 정의되더라도 미리 선언된 내용 때문에 전역 변수\n", " return h\n", "\n", "print(f(10))\n", "print(h) # 전역 변수 h 값이 함수 내에서 변경되었음" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- [주의] 동일 함수 내에서 동일한 변수가 지역변수와 전역변수로 동시에 활용될 수 없음\n", " - 함수 내에서 정의되는 변수는 지역 변수로 간주\n", " - 지역 변수로 선언되기 이전에 해당 변수를 사용할 수 없음" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "ename": "UnboundLocalError", "evalue": "local variable 'g' referenced before assignment", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mUnboundLocalError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m\u001b[0m in \u001b[0;36mf\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mg\u001b[0m \u001b[0;31m# r-value로 사용되는 g는 전역 변수\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m20\u001b[0m \u001b[0;31m# l-value로 정의되는 g는 지역 변수\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mUnboundLocalError\u001b[0m: local variable 'g' referenced before assignment" ] } ], "source": [ "g = 10\n", "\n", "def f():\n", " a = g # r-value로 사용되는 g는 전역 변수\n", " g = 20 # l-value로 정의되는 g는 지역 변수\n", " return a\n", "\n", "print(f())" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10\n", "20\n" ] } ], "source": [ "g = 10\n", "\n", "def f():\n", " global g # g는 전역 변수로 선언됨\n", " a = g # a는 지역 변수, g는 전역 변수\n", " g = 20 # g는 전역 변수\n", " return a\n", "\n", "print(f())\n", "print(g)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1-2 특정 공간의 이름 목록 얻기" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 이름(Name)\n", " - 변수 (객체) 이름\n", " - 함수 이름\n", " - 클래스 이름\n", " - 모듈 이름\n", "- dir(): 함수가 호출된 스코프에서 정의되어 있는 모든 Name들을 문자열 리스트로 반환한다. \n", "- dir(object): object이 지니고 있는 모든 Name들을 문자열 리스트로 반환한다." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '_dh', '_i', '_i1', '_i2', '_i3', '_i4', '_i5', '_ih', '_ii', '_iii', '_oh', 'exit', 'f', 'g', 'get_ipython', 'h', 'quit']\n" ] } ], "source": [ "print(dir())" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n" ] } ], "source": [ "l = []\n", "print(dir(l))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1-3 함수의 중첩 영역(Nested Scopes) 지원\n", "- Nested Scope: 함수 안에 정의되어 있는 함수 내부\n", " - 가장 안쪽의 스코프부터 바깥쪽의 스코프쪽으로 변수를 찾는다.\n", " - 각각의 중첩 함수마다 독립적인 Scope을 관리한다." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "20\n" ] } ], "source": [ "x = 2\n", "def F():\n", " x = 1\n", " def G():\n", " x = 20\n", " print(x)\n", " G()\n", "F()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "G(): 20\n", "F(): 1\n", "Global: 2\n" ] } ], "source": [ "x = 2\n", "def F():\n", " x = 1\n", " def G():\n", " x = 20\n", " print(\"G():\", x)\n", " G()\n", " print(\"F():\", x)\n", "F()\n", "print(\"Global:\", x)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "G(): 20\n", "F(): 1\n", "Global: 20\n" ] } ], "source": [ "x = 2\n", "def F():\n", " x = 1\n", " def G():\n", " global x\n", " x = 20\n", " print(\"G():\", x)\n", " G()\n", " print(\"F():\", x)\n", "F()\n", "print(\"Global:\", x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "## 2 모듈의 정의\n", "***\n", "- 모듈: 파이썬 프로그램 파일로서 파이썬 데이터와 함수등을 정의하고 있는 단위\n", " - 서로 연관된 작업을 하는 코드들을 묶어서 독립성을 유지하되 재사용 가능하게 만드는 단위\n", " - 모듈을 사용하는 측에서는 모듈에 정의된 함수나 변수 이름을 사용\n", "- 모듈의 종류\n", " - 표준 모듈\n", " - 파이썬 언어 패키지 안에 기본적으로 포함된 모듈\n", " - 대표적인 표준 모듈 예\n", " - math, string\n", " - 사용자 생성 모듈\n", " - 개발자가 직접 정의한 모듈\n", " - 써드 파티 모듈\n", " - 다른 업체나 개인이 만들어서 제공하는 모듈" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2-1 모듈은 어디에 저장되는가\n", "- 모듈이 정의되고 저장되는 곳은 파일\n", " - 파일\n", " - 모듈 코드를 저장하는 물리적인 단위\n", " - 모듈\n", " - 논리적으로 하나의 단위로 조직된 코드의 모임\n", "- 파이썬 모듈이 정의되는 파일의 확장자: .py\n", "- 다른 곳에서 모듈을 사용하게 되면 해당 모듈의 .py는 바이트 코드로 컴파일 되어 .pyc로 존재한다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2-2 사용자 모듈 만들기와 호출하기" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#File: mymath.py\n", "mypi = 3.14\n", "\n", "def add(a, b):\n", " return a + b\n", "\n", "def area(r):\n", " return mypi * r * r" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 모듈 이름은 해당 모듈을 정의한 파일 이름에서 .py를 제외한 것\n", " - 모듈을 불러오는 키워드: import\n", "- 모듈에서 정의한 이름 사용하기" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'add', 'area', 'mypi']\n", "3.14\n", "78.5\n" ] } ], "source": [ "import mymath\n", "\n", "print(dir(mymath)) # mymath에 정의된 이름들 확인하기\n", "print(mymath.mypi) # mymath 안에 정의된 mypi를 사용한다\n", "print(mymath.area(5)) # mymath 안에 정의된 area를 사용한다" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2-3 모듈을 왜 사용하는가?\n", "- 함수와 모듈\n", " - 함수: 파일 내에서 일부 코드를 묶는 것\n", " - 모듈: 파일 단위로 코드들을 묶는 것\n", " - 비슷하거나 관련된 일을 하는 함수나 상수값들을 모아서 하나의 파일에 저장하고 추후에 재사용하는 단위\n", "- 모듈 사용의 이점\n", " - 코드의 재사용\n", " - 프로그램 개발시에 전체 코드들을 여러 모듈 단위로 분리하여 설계함으로써 작업의 효율을 높일 수 있음\n", " - 별도의 이름 공간(스코프)를 제공함으로써 동일한 이름의 여러 함수나 변수들이 각 모듈마다 독립적으로 정의될 수 있다.\n", "- 별도 파일 내에 파이썬 코드를 저장할 때 (즉, 모듈을 코딩할 때) 한글 처리\n", " - 파일의 맨 위에 다음 코드를 넣어 준다.\n", " - \\# -\\*- coding:utf-8 -*-\n", "- 모듈은 하나의 독립된 이름 공간을 확보하면서 정의된다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2-4 모듈이 지닌 이름들 알아보기\n", "- dir(모듈): 모듈이 지니고 있는 모든 이름들을 리스트로 반환 " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Formatter', 'Template', '_ChainMap', '_TemplateMetaclass', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_re', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']\n" ] } ], "source": [ "import string\n", "print(dir(string))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2-5 이름 공간을 제공하는 다른 예들\n", "- 독립된 이름 공간(스코프)을 제공하는 것들\n", " - 모듈\n", " - 함수\n", " - 클래스\n", " - 객체" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- string 모듈 이름 공간에 변수 a를 생성한다.\n", " - 표준 모듈에 사용자가 정의하는 이름을 생성하는 것은 비추천\n", " - 단지 모듈 자체가 독립적인 이름 공간을 제공한다는 것을 알려줌" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "import string\n", "string.a = 1\n", "print(string.a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 클래스도 독립적인 이름 공간" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "2\n", "2\n" ] } ], "source": [ "class C: # 클래스도 독립적인 이름 공간\n", " a = 2 # 클래스 이름 공간 내에 변수 선언\n", " pass # 클래스 정의 완료\n", "\n", "c = C() # 클래스 인스턴스 객체 생성\n", "c.a = 1 # 클래스에서 생성된 인스턴스 객체도 별도의 이름 공간\n", "print(c.a)\n", "print(c.__class__.a)\n", "print(C.a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 함수도 독립적인 이름 공간\n", " - 다만 함수 내에서 선언된 지역(로컬) 변수는 함수 외부에서 접근할 수 없다." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "\n" ] }, { "ename": "AttributeError", "evalue": "'function' object has no attribute 'a'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m: 'function' object has no attribute 'a'" ] } ], "source": [ "x = 10 # 현재 모듈 내부에 정의되는 이름\n", "def f():\n", " a = 1\n", " b = 2 # 현재 모듈에 정의되는 함수 f 내에 이름 a,b를 정의하고있다. 함수도 독립적인 이름 공간\n", "f.c = 1\n", "print(f.c)\n", "print()\n", "print(f.a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "## 3 모듈 검색 경로\n", "***" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3-1 PYTHONPATH 환경 변수 설정하기\n", "- 파이썬이 모듈을 찾는 순서\n", " - 1) 이미 메모리에 로딩되어진 것\n", " - 2) 현재 디렉토리 (ipython에서 pwd 명령으로 확인 가능)\n", " \n", " - ! pwd\n", " \n", " \n", " - 3) PYTHONPATH 환경 변수에 기술된 디렉토리 목록을 차례로 탐색\n", " - 4) 표준 라이브러리 디렉토리들\n", " - sys 모듈 임포트 후 sys.path 로 확인 가능\n", " - sys.path.append(), sys.path.remove()로 추가, 삭제 가능\n", "- PYTHONPATH 환경 변수 설정 방법\n", " - 윈도우즈\n", " - 제어판\\시스템 및 보안\\시스템\\고급 시스템 설정\\환경 변수\n", " - 새로 만들기: 변수 이름 - PYTHONPATH, 변수 값 - C:\\Users\\yhhan\\mypythonlib\n", " - python 새로 시작하기 (cmd창 새로 시작한 후)\n", " - MAC이나 리눅스\n", " - ~/.bashrc, ~/.bash_profile, 혹은 ~/.profile 파일에 다음 라인 추가\n", " - export PYTHONPATH=/Users/yhhan/mypythonlib\n", " - 터미널 창에서 다음 명령어 수행 \n", " - source ~/.bash_profile\n", " - 이클립스에서 PYTHONPATH 설정\n", " - [참고] https://goo.gl/crPFi0 " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![inheritance](../images/pythonpath_eclipse.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 코드 내에서 모듈 검색 경로 확인하기" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python27.zip', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/plat-darwin', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/plat-mac', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/plat-mac/lib-scriptpackages', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/lib-tk', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/lib-old', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/lib-dynload', '/Users/yhhan/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/site-packages', '/Users/yhhan/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/IPython/extensions']\n" ] } ], "source": [ "import sys\n", "print sys.path" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3-2 모듈의 검색 경로 동적으로 바꾸기" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['', '/Users/yhhan/anaconda/lib/python36.zip', '/Users/yhhan/anaconda/lib/python3.6', '/Users/yhhan/anaconda/lib/python3.6/lib-dynload', '/Users/yhhan/anaconda/lib/python3.6/site-packages', '/Users/yhhan/anaconda/lib/python3.6/site-packages/Sphinx-1.5.1-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/aeosa', '/Users/yhhan/anaconda/lib/python3.6/site-packages/pip-9.0.1-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/six-1.10.0-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/sim2net-3.1.2-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/setuptools-33.1.1-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/IPython/extensions', '/Users/yhhan/.ipython', '~/mypythonlib']\n" ] } ], "source": [ "import sys\n", "\n", "sys.path.append('~/mypythonlib')\n", "print(sys.path)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['~/mypythonlib2', '', '/Users/yhhan/anaconda/lib/python36.zip', '/Users/yhhan/anaconda/lib/python3.6', '/Users/yhhan/anaconda/lib/python3.6/lib-dynload', '/Users/yhhan/anaconda/lib/python3.6/site-packages', '/Users/yhhan/anaconda/lib/python3.6/site-packages/Sphinx-1.5.1-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/aeosa', '/Users/yhhan/anaconda/lib/python3.6/site-packages/pip-9.0.1-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/six-1.10.0-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/sim2net-3.1.2-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/setuptools-33.1.1-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/IPython/extensions', '/Users/yhhan/.ipython', '~/mypythonlib']\n" ] } ], "source": [ "sys.path.insert(0, '~/mypythonlib2')\n", "print(sys.path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.8" } }, "nbformat": 4, "nbformat_minor": 1 }