深入了解import宣告

2021-10-06 09:52:51 字數 3820 閱讀 7967

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.pyb1.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.pysys.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.pysys.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的開發,而無需擔心資料...