import moudle_name ----> import module_name.py ---> import module_name.py文件路徑 -----> sys.path (這裏進行查找文件)python
# from app.web import Person import app.web.Person as Person #至關於把 Person.py 模塊內容賦給了 Person 了
import 優先級高於 from module import xxweb
規則:app
若是多個包,儘可能使用 from module import xx 或者 import module as xx函數
1.第一步sys.path 查看系統查找的路徑集合;spa
2.包 包下面有多個module 文件,和 __init__.py 文件.net
3.模塊 import packageA.module 命令行
4.模塊裏面的方法,類,屬性等code
python3 自定義模塊三種方式導入blog
(轉載地址:https://blog.csdn.net/pwc1996/article/details/52577148)utf-8
這裏有個大前提,就是你的py執行文件和模塊同屬於同個目錄(父級目錄),以下圖:
我把pwcong模塊提供的函數寫在 __init__.py
裏,裏面只提供一個 hi
函數:
# pwcong 模塊的 __init__.py # -*- coding: utf-8 -*- def hi(): print("hi")
執行文件main.py直接import模塊:
# main.py # -*- coding: utf-8 -*- import pwcong pwcong.hi()
接着咱們運行一下main.py能夠看到命令行窗口輸出了一句 hi
,第一種方式完成。
使用模塊方式爲:先導入--->接着輸入模塊.變量|函數
, 如上面例子的 pwcong.hi()
若是執行文件和模塊不在同一目錄,這時候直接import是找不到自定義模塊的。以下圖:
sys模塊是python內置的,所以咱們導入自定義模塊的步驟以下:
先導入sys模塊
而後經過sys.path.append(path)
函數來導入自定義模塊所在的目錄
導入自定義模塊。
這時候 main.py 這樣寫:
# main.py # -*- coding: utf-8 -*- import sys sys.path.append(r"C:\Users\Pwcong\Desktop\python") import pwcong pwcong.hi()
最後執行main.py文件,最終輸出 hi
,第二種方式完成。
這個方法原理就是利用了系統變量,python會掃描path變量的路徑來導入模塊,能夠在系統path裏面添加。可是我仍是推薦使用pth文件添加。
模塊和執行文件目錄結構跟上圖同樣:
咱們建立一個 module_pwcong.pth 文件,裏面內容就是 pwcong模塊所在的目錄:
C:\Users\Pwcong\Desktop\python
將該 module_pwcong.pth 文件放到這裏: python安裝目錄\Python35\Lib\site-packages
例如個人:
而後 main.py 導入並使用自定義模塊:
# -*- coding: utf-8 -*- import pwcong pwcong.hi()
最後執行 main.py 文件,能夠輸出 hi
,第三種方式完成。
=====================================================================================
以前用C語言寫做業的時候,偶爾會遇到文件相互引用致使不能編譯的問題,那麼Python中是否會遇到這種狀況呢
# a.py import b name = 'a' print b.name # b.py import a name = 'b' print a.name
結果是AttributeError: 'module' object has no attribute 'name'
因而,換個方法試試
# a.py import b name = 'a' if __name__ == '__main__': print b.name # b.py import a name = 'b' if __name__ == '__main__': print a.name
這樣兩個均可以運行了,爲了進一步研究,再換一下
# a.py import b name = 'a' if __name__ == '__main__': print b.name # b.py import a name = 'b' print a.name
這樣只有a能運行了,b不能運行
並且a輸出的是
a
b
這樣看來,import語句會先執行module裏的內容,而後再向下執行
所以,若是兩個模塊中都只有數據和函數的話,相互import是不會出現問題的,只有在出現全局做用域出現語句時,纔有可能出現問題,固然,這種狀況也是能夠想辦法避免的啦。