很多東西似懂非懂,或者當時看懂了,但是感覺不是很重要,經常不用,時間久了,也就變得似懂非懂了。今天被某度電話面試問道一個問題,就是模塊倒入,其實我之前也是很仔細的研究過的,不過由於平時做的東西太簡單,用不到模塊倒入。
大致對話如下:
面試官:你了解python中模塊么?自定義的模塊是什么樣子的?
我:模塊就是把經常要用到的函數,類,常量寫到一個文件夾下的python文件中,然后去調用
面試官:那自定義的模塊怎么倒入呢
我:直接 import 包名.模塊名
面試官:你說的是java吧,python也叫包名?難道不是路徑名?
我:對,是路徑名,就是路徑名中斜杠換成了點。
面試官:那為什么os,sys這些包不想要導入你說的包名
我:那些模塊已經在python自己的路徑里了,所以不需要,具體是什么路徑我記不清了
。。。。
這個模塊導入問題我之前是很清楚的,但是感覺沒用,就選擇性的忘記了,結果今天被這個問題絆了個跟頭
正文:
python倒入模塊順序如下:可以用sys.path去查看,返回的是一個列表,就是python的模塊查找順序,也就是說如果你自己的模塊路徑在sys.path里出現了,那么就可以直接倒入模塊名
1. 程序所在的文件夾
2. 標准庫的安裝路徑
3. 操作系統環境變量PYTHONPATH所包含的路徑
因為os,sys等模塊在python的安裝路徑下,所以需要倒入路徑,后期用easy_install 或者pip安裝的模塊也已經安裝路徑里了,所以也不需要倒入路徑。
從上面的查找模塊順序我們就可以知道有兩種方法去導入外部模塊,1.通過文件夾方法,此種方法當文件路徑較長時,多次倒入時會顯得很麻煩,2.通過設置python的環境變量PYTHONPATH,次方法相當於將你的模塊變成標准庫中的模塊,注意,是相當於,就會死說導入模塊時也是直接倒入模塊名。
先來看方法1:
比如,我做的例子:都在/home/xx/python/test
------ __init__.py (此文件可以為空,它的存在只是為了說明這是一個python模塊,當然沒有此文件就不能成功倒入此文件夾下的模塊到其他的python文件中)
-------Human.py
-------HumanTest.py
-------fibTest.py
-------/student/ (test文件夾下的student文件夾)
----------__init__.py
----------Student.py
-----------fib.py
------------HumanTest.py
情況1:需要導入的模塊在同一個文件夾中,比如HumanTest.py調用Human模塊,就直接 import Human,因為python解釋器查找模塊時會找同一文件夾,所以不用導入路徑名。
情況2:需要導入的文件在文件夾的子文件夾中,比如fibTest.py調用student文件夾下的fib模塊,則 from student.fib imorpt fib,無需加其他路徑說明,因為student也是一個模塊(模塊的集合)
但是要特別說明一下,我做例子的時候犯了一個錯誤:Student.py中導入了Human模塊,為了少幾個文件,我直接在Human.py中又去導入Student模塊,結果當然是錯誤的,因為循環導入了,不過一般不會犯這種錯誤。
情況3:需要導入的模塊在父文件夾中,比如Stuent.py要導入Human模塊,此時要注意,不能直接import test.Human ,因為解釋器找模塊只會去本文件夾及本文件夾的子文件夾去找,不會去父文件夾找。。。那怎么辦,只能將父文件夾的路徑加在sys.path里了
所以,在Student導入Human時應該這樣,首先import sys ,sys.path.append(“..”),然后再導入Human模塊,import Human
這種情況可以推廣一下,就是所有的導入其實都可以這么做,情況1和情況2也可以這么做,不過也是多次一舉,適合導入的模塊在其他不相關的我文件下。在前兩后寫上:import sys, sys.path.append("path"), import yourModule 其中path是youModule的文件夾路徑。
再看方法2:
就是添加python環境變量。export PYTHONPATH=path ,此處path也是你的模塊的父文件夾,至於怎么export環境變量可以查看linux的 export。這種方法顯然會方便很多,推薦使用。
我的例子都是在ubuntu做的,windows中方法1沒有問題,方法2設置python環境變量可以查看windows設置環境變量的方法,不再贅述。