python是如何找到對應的package的?

世有因果知因求果發表於2018-08-02

我們在寫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模組

 

相關文章