python 模塊化管理,導入自己的模塊(包)


很多東西似懂非懂,或者當時看懂了,但是感覺不是很重要,經常不用,時間久了,也就變得似懂非懂了。今天被某度電話面試問道一個問題,就是模塊倒入,其實我之前也是很仔細的研究過的,不過由於平時做的東西太簡單,用不到模塊倒入。

大致對話如下:

面試官:你了解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設置環境變量的方法,不再贅述。


免責聲明!

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



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