由PYTHONPATH談起


   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模塊是否可以包含其他子模塊?)

 

   以上難免有遺漏疏忽之處,還望大家指正。


免責聲明!

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



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