PYTHONPATH是Python搜索路徑,默認我們import的模塊都會從PYTHONPATH里面尋找。
使用下面的代碼可以打印PYTHONPATH:
print(os.sys.path)
我的某個項目的PYTHONPATH如下:
[
'D:\\Python3\\workspace\\PythonLab\\src',
'D:\\aptana3\\plugins\\org.python.pydev_2.7.0.2012080220\\pysrc',
'D:\\Python3\\python33.zip', 'D:\\Python3\\DLLs',
'D:\\Python3\\lib',
'D:\\Python3',
'D:\\Python3\\lib\\site-packages'
]
比如我使用下面的import語句:
import urllib
Python解釋器會逐個從上面的路徑列表選出一個路徑然后搜索urllib模塊直到找到為止。這里最后在 D:\Python3\lib 下找到,如下圖:
而D:\Python3\Lib\site-packages目錄下全部是第三方Python模塊,比如我之前安裝的xlrd模塊(處理Excel的Python模塊):
與PYTHONPATH有關的一個問題是Eclipse下使用PyDev開發Python可能遇到的Unresolved Import問題,其解決方法就是設置項目的PYTHONPATH,將要導入的模塊所在的目錄添加到PYTHONPATH中:
或者全局設置某個Python解釋器的PYTHONPATH:
在urllib模塊目錄下有下面這些文件:
request是urllib模塊下的一個子模塊,所以我們可以這樣導入request模塊:
import urllib.request
或者:
from urllib import request
而urlopen是urlrequest模塊下的一個函數,我們可不可以這樣導入
import urllib.request.urlopen
然后像下面這樣直接調用urlopen呢?
resp = urlopen('http://baidu.com')
答案是不能,會報下面的錯:
Traceback (most recent call last): File "D:\Python3\workspace\PythonLab\src\Utilities.py", line 13, in <module> import urllib.request.urlopen ImportError: No module named 'urllib.request.urlopen'; urllib.request is not a package
即沒有一個模塊的名稱是”urllib.request.urlopen",那要如何導入某個函數呢,答案是使用from [Module Name] import [Function Name]語法,比如下面:
from urllib.request import urlopen
然后直接調用上面的urlopen函數就沒有任何問題了。這種方法的缺陷就是這樣導入之后,urlopen就定死了,你不能再寫一個叫urlopen的函數,不然會覆蓋這個函數。但我們也可以不導入函數,而使用函數的“全限名”(或者導入request子模塊后,通過 request.urlopen('http://baidu.com') )來調用:
urllib.request.urlopen('http://baidu.com')
上面得到的教訓是:
使用import xx語法時,xx只能是模塊路徑(一個模塊一般是指一個package或者一個以.py為后綴的文件,不一般的情況包括.pth、.dll以及其他擴展形式)。
而且一般只有package模塊下面才可以包含子模塊(不知道准確不准確,DLL模塊是否可以包含其他子模塊?)
以上難免有遺漏疏忽之處,還望大家指正。