我們在寫python程式碼或者閱讀別人的程式碼時,可能會碰到對應module無法找到的問題,這時如何解決呢?我們如果對python直譯器如何查詢對應的module有比較深刻的理解,那麼我們就可以輕鬆解決相關問題。
https://leemendelowitz.github.io/blog/how-does-python-find-packages.html
sys.path
import sys print('\n'.join(sys.path)) # 當前目錄 D:\devenv\Code\intro_ds\knowhow D:\devenv\Code\intro_ds # anaconda D:\Continuum\Anaconda3\python35.zip D:\Continuum\Anaconda3\DLLs D:\Continuum\Anaconda3\lib D:\Continuum\Anaconda3 D:\Continuum\Anaconda3\lib\site-packages D:\Continuum\Anaconda3\lib\site-packages\Sphinx-1.4.6-py3.5.egg D:\Continuum\Anaconda3\lib\site-packages\win32 D:\Continuum\Anaconda3\lib\site-packages\win32\lib D:\Continuum\Anaconda3\lib\site-packages\Pythonwin D:\Continuum\Anaconda3\lib\site-packages\setuptools-27.2.0-py3.5.egg
上面看到sys.path目錄包含了當前指令碼所在的目錄以及對應安裝site環境,那麼問題來了:
sys.path是如何被賦值的
從python的文件中https://docs.python.org/2/library/sys.html#sys.path看到:sys.path使用當前的工作目錄,以及羅列在PYTHONPATH環境變數中的目錄,再加上installation-dependent default paths(這是由site模組來控制的)
如果你的PYTHONPATH環境變數並沒有設定,則sys.path將包含:當前工作目錄+site模組執行的目錄變更。當你啟動python時,site模組自動被imported載入。
https://docs.python.org/2/library/site.html#module-site
操作sys.path
import sys, os # This won't work - there is no hi module import hi Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named hi # Create a hi module in your home directory. home_dir = os.path.expanduser("~") my_module_file = os.path.join(home_dir, "hi.py") with open(my_module_file, 'w') as f: f.write('print "hi"\n') f.write('a=10\n') # Add the home directory to sys.path sys.path.append(home_dir) # Now this works, and prints hi! import hi print hi.a
module的__file__屬性
當你import一個module時,你可以通過檢視__file__屬性來找到該module具體存在於哪個目錄中:
> import numpy > numpy.__file__ '/usr/local/lib/python2.7/dist-packages/numpy/__init__.pyc'
注意,以上對於靜態編譯到直譯器的內建module不適用,比如sys模組就沒有__file__屬性
imp模組