1. 程式人生 > >python匯入父級別目錄

python匯入父級別目錄

使用python進行程式編寫時,經常會使用第三方模組包。這種包我們可以通過python setup install 進行安裝後,通過import XXX或from XXX import yyy 進行匯入。不過如果是自己遍寫的依賴包,又不想安裝到python的相應目錄,可以放到本目錄裡進行import進行呼叫;為了更清晰的理清程式之間的關係,例如我們會把這種包放到lib目錄再呼叫。本篇就針對常見的模組呼叫方法彙總下。

一、同級目錄下的調有

程式結構如下:

– src
|– mod1.py
|– test1.py
若在程式test1.py中匯入模組mod1, 則直接使用

import mod1
或
from mod1 import *;

二、呼叫子目錄下的模組

程式結構如下:

– src
|– mod1.py
|– lib
| |– mod2.py
|– test1.py
這時看到test1.py和lib目錄(即mod2.py的父級目錄),如果想在程式test1.py中匯入模組mod2.py ,可以在lib件夾中建立空檔案init.py檔案(也可以在該檔案中自定義輸出模組介面),然後使用:

from lib.mod2 import *
或
import lib.mod2.

三、呼叫上級目錄下的檔案

程式結構如下:

– src
|– mod1.py
|– lib
| |– mod2.py
|– sub
| |– test2.py
這裡想要實現test2.py呼叫mod1.py和mod2.py ,做法是我們先跳到src目錄下面,直接可以呼叫mod1,然後在lib上當下建一個空檔案init.py ,就可以像第二步呼叫子目錄下的模組一樣,通過import lib.mod2進行呼叫了。具體程式碼如下:

import sys
sys.path.append("..")
import mod1
import mod2.mod2

we also can export PYTHONPATH=< dir that your want to find>
//
//
//
//
一個python檔案就是一個模組,使用獨立的名稱空間,但實際使用過程中單單用模組來定義python功能顯然還不夠。因為一個大型的系統幾千上萬個模組是很正常的事情,如果都聚集在一起顯然不好管理並且有命名衝突的可能,因此python中也出現了一個包的概念。

一、python中的包介紹
包是通過使用“點模組名稱”建立Python模組名稱空間的一種方法。列如,模組名稱 A.B 表示一個在名為 A的包下的名為B的子模組。就像使用模組讓不同模組的作者無需擔心彼此全域性變數名稱(衝突)一樣,點模組名稱讓多模組包的作者無需擔心彼此的模組名稱(衝突)。模組包在檔案系統中的表示就是一系列目錄的集合,通過目錄的層級結構形成模組包的層級結構,最終的模組檔案就位於最後的目錄中。比如定義一個簡單的模組在包pkg下,那麼執行如下步驟:

1、在D:\temp目錄下建立一個目錄,名稱是pkg

2、在pkg下建立一個init.py的模組,內容為空即可

3、在pkg目錄下建立一個python模組module_3.py,內容如下:

”’pkg.module_3.py模組的內容”’

print(“Hello World”)

def func1():
print(“This is funciton one”)
注意第2步,必須要在每一個包目錄下建立一個init.py的模組,這個是python的規定,用來告訴python直譯器將該目錄當成一個內容包,即該目錄是一個包,裡面包含了python模組的。這個是必須的,如果不指定,則我們在python的互動模式下匯入module_3.py這個模組時會報如下錯誤:

import pkg.module_3
Traceback (most recent call last):
File “”, line 1, in
ImportError: No module named pkg.module_3
因此包目錄下的init.py模組是必須的,但內容是可選的,可以為空內容,也可以寫一些程式碼或作其他用途。PVM在匯入某個包下的模組時會先匯入這個包下的init.py模組,比如我們將init.py模組的內容指定如下:

print(“This is init module”)
然後在互動模式下重新匯入這個包,則效果如下:

import pkg.module_3
This is init module
Hello World

  可見,PVM首先載入的是__init__.py模組,然後才是找該目錄下的其他模組並進行載入。

二、python中的模組搜尋路徑
在一個模組被匯入時,PVM會在後臺從一系列路徑中搜索該模組,其搜尋過程如下:

1、在當前目錄下搜尋該模組;

2、在環境變數PYTHONPATH中指定的路徑列表中依次搜尋;

3、在python安裝路徑中搜索

  事實上,PVM通過變數sys.path中包含的路徑來搜尋,這個變數裡面包含的路徑列表就是上面提到的這些路徑資訊,我們可以列印看下sys.pth都包含些哪些路徑:

import sys
print(sys.path)
[”, ‘C:\Windows\system32\python27.zip’, ‘D:\tools\Python27\DLLs’, ‘D:\to
ols\Python27\lib’, ‘D:\tools\Python27\lib\plat-win’, ‘D:\tools\Python27\
\lib\lib-tk’, ‘D:\tools\Python27’, ‘D:\tools\Python27\lib\site-packages’,
‘D:\tools\Python27\lib\site-packages\wx-2.8-msw-unicode’]
不同的機器上顯示的路徑資訊可能不一樣,但至少都包含上面提到的3點。知道了這個路徑搜尋規律後,我們就可以很方便的將某些目錄動態的增加到搜尋路徑中去,比如在E盤下建立一個python模組module_4.py,內容如下:

print(“Hello world”)
print 2 ** 2
然後在互動模式下執行匯入:

import module_4
Traceback (most recent call last):
File “”, line 1, in
ImportError: No module named module_4
報錯是預料中的,因為E盤並不在python模組的搜尋路徑中,然後我們動態的增加這個路徑到搜尋模組中,再執行匯入:

sys.path.append(“E:\”)
print(sys.path)
[”, ‘C:\Windows\system32\python27.zip’, ‘D:\tools\Python27\DLLs’, ‘D:\to
ols\Python27\lib’, ‘D:\tools\Python27\lib\plat-win’, ‘D:\tools\Python27\
\lib\lib-tk’, ‘D:\tools\Python27’, ‘D:\tools\Python27\lib\site-packages’,
‘D:\tools\Python27\lib\site-packages\wx-2.8-msw-unicode’, ‘E:\’]
import module_4
Hello world
4
首先是在sys.path中增加了E盤根目錄作為搜尋路徑,隨後的列印中可以看到確實已經被新增到sys.path中去了,然後再執行匯入就會正常匯入模組並執行模組中的語句了。當然,我們通過互動模式新增加的搜尋路徑也僅僅是在當前互動模式下有效,一旦退出了那麼就就失效了。因此,我們可以根據搜尋路徑規則的第2步中說的來設定PYTHONPATH環境變數就可以滿足不同使用情況下都可以找到模組了。