在 Python 裡頭的 script 或直譯器看到
>>> import a
Python 會怎麼處理? 它處理的順序大致上是
- 當前目錄有無原始碼檔案 a.py 檔,
- 當前目錄有無位元碼檔案 a.pyc 檔,
- 當前檔案是否有目錄 a ( 當目錄 a 底下有 __init__.py 時)
- 在 Python 預設路徑會去搜尋的路徑尋找有無 a.py, a.pyc, 目錄 a, ...等等。
Python import search path (Python import 模組時會在哪些目錄搜尋 有可能可以被作為模組匯入的檔案)
>>> import sys >>> print sys.path ['', '/usr/local/lib/python2.6/dist-packages/setuptools-0.6c11-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/pip-1.1-py2.6.egg', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/python2.6/dist-packages/gst-0.10', '/usr/lib/pymodules/python2.6', '/usr/lib/python2.6/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.6/gtk-2.0', '/usr/local/lib/python2.6/dist-packages']
在 sys.path 裡的空字串 '' 代表當前目錄。
除了官方內建的模組(例如: math, re, csv, time, os, sys)等等, 其餘你所寫的模組, 舉例來說,你寫了一個 a.py 模組 ,想要在其他地方可以使用 import a 。
那麼你會發現,除了在 a.py 所在目錄之下, import a 可以成功執行之外,其他的時候會失敗, Python 會告訴你
>>> import a Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named a
為什麼會這樣? 其實我們從 sys.path 的內容就知道原因了, 因為 a.py 檔並沒有在 sys.path 所紀錄的目錄字串裡的任一一個目錄, 因此 Python 找不到它。
面對這樣的情況,有許多種不同的方式可以處理, 讓 Python 可以找到 a.py 檔,將其作為模組匯入。 假設 a.py 位於 /home/ming/py_module 。
- sys.path
- PYTHONPATH
- pth
Metho1 sys.path
如前所述, sys.path 紀錄了哪些目錄會被搜尋, 因此執行時修改這個 sys.path 就可以。
例如:
>>> import sys >>> sys.append("/home/ming/py_module")
Method2 通過設定 PYTHONPATH 環境變數
bash
export PYTHONPATH=/home/ming/py_module:$PYTHONPATH
csh
setenv PYTHONPATH /home/ming/py_module
Method3 pth
In terminal,
>>> which python /usr/bin/python >>> python ( start python interpreter (python2.6) )
>>> import os >>> iportt site >>> site.USER_SITE '/home/ming/.local/lib/python2.6/site-packages'
建立 /home/ming/.local/lib/python2.6/site-packages 目錄, 將 pth 檔放到裡頭。
已載入的模組
>>> import sys >>> print sys.modules.keys()
模組所在路徑(被安裝的路徑)
>>> import math >>> print math.__file__ or In terminal >>> python -c "import math; print math.__file__"
安裝 Python 模組時, 安裝的路徑
>>> import sys >>> import sys.prefix >>> import sys.exec_prefix