python在import其他模組到import成功的過程中都發生了些什麼?

時間 2021-05-09 14:26:13

1樓:王澤民

import 有多種形式:

import A.B

from A import B

from A import B as C

其實所做的事情都是 import X.Y.Z 形式

不同寫法只不過最後是把module 或者module中的哪些物件以什麼樣的符號加入區域性命名空間,

載入過程是一樣的

過程主要分為三個步驟。

1.解析搜尋module 路徑

2.module pool(sys.modules)維護

已經存在的module

非內建的module(載入過一次後)

內建module(一開始就載入進來)

對不同格式module 動態載入 (py,pyc,pyd)

3.符號匯入涉及python 虛擬機器執行,留坑等我了解完python 虛擬機器之後再補充。

過程不複雜,就是讀取module 所有物件,建立乙個dict

然後更新區域性命名空間。

import 都是在乙個package 環境下操作的

沿著 __main__.x.y.z 所示的樹狀結構路徑去載入

乙個資料夾有__init__.py 就可以被識別成package

在__init__.py 中可以import, 和在資料夾內的其它py檔案中import 的差別是package環境不同

沿著路徑載入package或module,載入完都是乙個module物件,不過package 有path屬性,module 沒有。

module 應該在package 或者python的標準搜尋路徑中。import不能跨package

就算是巢狀import ,在當前module import 只影響到module 自身命名空間,不會影響到上一層。

無論何時何地import 都會影響到到全域性module pool

2樓:李巨集杰

1. 定位模組檔案, 按照以下順序檢索:

程式主目錄

PYTHONPATH 目錄

標準鏈結庫目錄

任何.pth 檔案內容

通過sys.path可以檢視上述目錄的匯入順序:

In [1]: import sys

In [2]: sys.path

Out[2]:

['',

'/home/lihongjie/anaconda3/bin',

'/home/lihongjie/anaconda3/lib/python36.zip',

'/home/lihongjie/anaconda3/lib/python3.6',

'/home/lihongjie/anaconda3/lib/python3.6/lib-dynload',

'/home/lihongjie/anaconda3/lib/python3.6/site-packages',

'/home/lihongjie/anaconda3/lib/python3.6/site-packages/Sphinx-1.5.1-py3.6.egg',

'/home/lihongjie/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg',

'/home/lihongjie/anaconda3/lib/python3.6/site-packages/IPython/extensions',

'/home/lihongjie/.ipython']

2. 將匯入的模組編譯成位元組碼, 也就是我們通常看到的.pyc檔案

3. 執行編譯好的位元組碼, 返回乙個模組物件, 模組中的所有全域性變數都變成該物件的屬性. 這也就是我們可以在匯入模組之後可以使用

module.attr

來獲取模組中的物件.

3樓:

PEP 328 -- Imports: Multi-Line and Absolute/Relative

簡單來說,就是先從 sys.modules 裡面找一遍,找不到再去找 pkg 之類的。 建議仔細看看pep

Python 中如何同時 import 乙個包的兩個版本?

意群 續樓上,假設當前目錄為 zhangbin from a import c as a cfrom b import c as b c然後分別呼叫 a c.hello b c.hello IAMSK 比如 Users zhangbin a 和 Users zhangbin b 下各有乙個 lib ...

Python 如何啟動其他程式

如果有100個航母戰鬥群,你我連在知乎回覆答案的時間都沒有,都要去非洲挖煤賺錢養航母了 你對軍費毫無概念啊。不過無所謂了 二戰時美國有過147艘航艦,英國有過96艘航艦,其中艦隊級航艦,相對於所處時代來說,都比現在的001 002要強。就這艦船和艦載機的水平造100艘,也不過讓F35機隊多出動幾個來...

Python在科學計算 資料分析已經把其他語言Julia,f ,r壓的無路可走了嗎?

Spark 如果以後的世界發展到不需要程式設計就能解決問題,不管是Python R還是Julia F 都會被時代淘汰掉,不是危言聳聽,已經有一些軟體具備這樣的實力了,10年後大家再看這個世界會變成什麼樣。 lalala 不可能很明顯,python在人工智慧等的浪潮下碾壓其他是有前置條件的,比如你有一...