import宣告即用於匯入模組,比如import numpy as np
,但是涉及複雜工程目錄時容易搞得稀里糊塗,於是我專門使用了python3.7
來測試並解決import相關問題。
如果import匯入了乙個module,就能執行該module中的所有**。匯入package時,會執行package目錄下的__init__.py
,然後通過__init__.py
執行package目錄下的所有module,__init__.py
可以是空的,前面講到在python3.3以上,__init__.py
可以沒有。
import會自動在sys.path
包含的目錄中尋找相應的模組或者包,在乙個.py
指令碼被執行時,sys.path
會初始化包含以下目錄:
常用的import方式有四種:
import
import
from
import
object
>
from
import
<
object
>
當然還有
import
as# 比如 import numpy as np
import
<
object
>
as
對於以下的工程目錄:
test/ # 跟目錄
packa/ # package packa
suba/ # subpackage suba
__init__.py
sa1.py
sa2.py
__init__.py
a1.py
a2.py
packb/ # package packb (implicit namespace package)
b1.py
b2.py
other.py
start.py
要在start.py
中匯入系統numpy
模組,以及同級目錄下的other
模組,只需要:
import numpy
import numpy as np # 通常將numpy重新命名為np
import other
然後執行start.py
指令碼
如果需要在start.py
中匯入a1.py
,b1.py
以及sa1.py
模組,只需要在start.py
中:
import packa.a1
import packb.b1
import packa.suba.sa1
如果只需要匯入比如a1.py
某個函式a1_func()
,只需要:
from packa.a1 import a1_func(
)from packa.suba.sa1 import sa1_func(
)# 跟上面同理
注意在start.py
和在a1.py
匯入sa1.py
是不同的,在a1.py
需要:
import suba.sa1
from suba.sa1 import sa1_func(
)from suba import sa2
因為執行a1.py
時sys.path
的相應目錄已經改變,只包含a1.py
指令碼所在的目錄。而對於python3,在start.py
是不能跨越子目錄直接匯入sa1.py
的,比如from suba import sa1
,但是在python2中可以,下面做個簡單的總結:
執行from packa.suba import sa1
from suba import sa1
start.py
okpy2 ok, py3 fail (suba not in test/)
a1.py
fail (packa not in test/packa/)
ok如果需要在a1.py
中匯入父目錄下other.py
或者是packb
目錄下的b1.py
,此時就需要對sys.path
作出修改了,因為執行a1.py
時sys.path
包含a1.py
所在的目錄packa
,並不包含目錄packb
以及父目錄test
。
修改sys.path
需要用到sys
以及os
模組,首先需要知道怎麼獲取當前目錄以及父目錄,在a1.py
中如下:
current_path=os.path.dirname(__file__)
#當前a1.py所在的目錄packa
parent_path=os.path.dirname(os.path.dirname(__file__)
)#當前a1.py所在的父目錄或者說上級目錄test
p_parent_path=os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
##獲取上上級目錄
下面修改sys.path
,對於在a1.py
中匯入父目錄下other.py
或者是packb
目錄下的b1.py
,只需要將parent_path
加入到```sys.path``即可,
然後就可以匯入other.py
以及b1.py
了,完整**如下:
import sys,os
# print(os.getcwd())
parent_path=os.path.dirname(os.path.dirname(__file__)
)# 獲取上級目錄
p_parent_path=os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
# 獲取上上級目錄
# 修改sys.path
import other # 匯入test下的other
import packb.b1 # 匯入b1
import packa.a2 #匯入a2
import a2 # 此時sys.path既包含上級目錄test也包含當前目錄packa,所以跟上面一樣
此外順便提到os.getcwd()
,注意該函式是獲取當前終端的路徑而不是指令碼的路徑,所以為了避免混淆,建議採用os.path.dirname(__file__)
這樣的形式。 深入了解A
一 前言 在這裡我將對a 演算法的實際應用進行一定的 並且舉乙個有關a 演算法在最短路徑搜尋的例子。值得注意的是這裡並不對a 的基本的概念作介紹,如果你還對a 演算法不清楚的話,請看姊妹篇 初識a 演算法 這裡所舉的例子是參考amit主頁中的乙個源程式,使用這個源程式時,應該遵守一定的公約。二 a ...
深入了解A
一 前言 在這裡我將對a 演算法的實際應用進行一定的 並且舉乙個有關a 演算法在最短路徑搜尋的例子。值得注意的是這裡並不對a 的基本的概念作介紹,如果你還對a 演算法不清楚的話,請看姊妹篇 初識a 演算法 這裡所舉的例子是參考amit主頁中的乙個源程式,使用這個源程式時,應該遵守一定的公約。二 a ...
深入了解Dojo Data
譯自http www.sitepen.com blog 2010 10 13 dive into dojo data 使用dojo data有助於快速建立web應用的介面,且易於嵌入各種資料來源。它在使用者介面與底層資料之間提供了一層抽象層,使得使用者介面開發人員能夠專注於ui的開發,而無需擔心資料...