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


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM