1. 程式人生 > >Python自定義包引入

Python自定義包引入

python中的Module是比較重要的概念。常見的情況是,事先寫好一個.py 件,在另一個檔案中需要import時,將事先寫好的.py檔案拷貝 到當前目錄,或者是在中增加事先寫好的.py檔案所在的目錄,然後import。這樣的做法,對於少數檔案是可行的,但如果程式數目很 多,層級很複雜,就很吃力了。有沒有辦法,像JavaPackage一樣,將多個.py檔案組織起來,以便在外部統一呼叫,和在內部互相呼叫呢?答案是有的。主要是用到python的包的概念,python __init__.py在包裡起一個比較重要的作用要弄明白這個問題,首先要知道,python在執行import語句時,到底進行了什麼操作,按照

python的文件,它執行了如下操作:1步,建立一個新的,空的module物件(它可能包含多個module);2步,把這個module物件插入sys.module3步,裝載module的程式碼(如果需要,首先必須編譯)4步,執行新的module中對應的程式碼。在執行第3步時,首先要找到module程式所在的位置,其原理為: 果需要匯入的module的名字是m1,則直譯器必須找到m1.py,它首先在當前目錄查詢,然後是在環境變數PYTHONPATH中查詢。 PYTHONPATH可以視為系統的PATH變數一類的東西,其中包含若干個目錄。如果PYTHONPATH沒有設定,或者找不到m1.py
,則繼續搜尋 python的安裝設定相關的預設路徑,在Unix下,通常是/usr/local/lib/python事實上,搜尋的順序是:當前路徑 (以及從當前目錄指定的sys.path),然後是PYTHONPATH,然後是python的安裝設定相關的預設路徑。正因為存在這樣的順序,如果當前 路徑或PYTHONPATH中存在與標準module同樣的module,則會覆蓋標準module。也就是說,如果當前目錄下存在xml.py,那麼執 import xml時,匯入的是當前目錄下的module,而不是系統標準的xml瞭解了這些,我們就可以先構建一個package,以普通module的方式匯入,就可以直接訪問此
package中的各個module了。

Python
中的package定義很簡單,其層次結構與程式所在目錄的層次結構相同,這一點與Java類似,唯一不同的地方在於,python中的package必須包含一個__init__.py的檔案。例如,我們可以這樣組織一個package:

package1/    __init__.py    subPack1/        __init__.py        module_11.py        module_12.py        module_13.py    subPack2/        __init__.py        module_21.py        module_22.py
    ……

__init__.py
可以為空,只要它存在,就表明此目錄應被作為一個package處理。當然,__init__.py中也可以設定相應的內容,下文詳細介紹。好了,現在我們在module_11.py中定義一個函式:
def funA():    print "funcA in module_11"    return

在頂層目錄(也就是package1所在的目錄,當然也參考上面的介紹,將package1放在直譯器能夠搜尋到的地方)執行python:

>>>from package1.subPack1.module_11 import funcA>>>funcA()
funcA in module_11

這樣,我們就按照package的層次關係,正確呼叫了module_11中的函式。細心的使用者會發現,有時在import語句中會出現萬用字元*,匯入某個module中的所有元素,這是怎麼實現的呢?答案就在__init__.py中。我們在subPack1__init__.py檔案中寫

__all__ = ['module_13', 'module_12']

然後進入python
>>>from package1.subPack1 import *>>>module_11.funcA()Traceback (most recent call last):  File "", line 1, in ImportError: No module named module_11

也就是說,以*匯入時,package內的module是受__init__.py限制的。好了,最後來看看,如何在package內部互相呼叫。如果希望呼叫同一個package中的module,則直接import即可。也就是說,在module_12.py中,可以直接使用
import module_11

如果不在同一個package中,例如我們希望在module_21.py中呼叫module_11.py中的FuncA,則應該這樣:
from module_11
包名.module_11 import funcA

包機制

# a.py
def add_func(a,b):
    return a+b

b.py
from import add_func Also can be import a

print ("Import add_func from module a")
print ("Result of plus is: ")
print (add_func(1,2))    If using "import a" then here should be "a.add_func"

module
可以定義在包裡面.Python定義包的方式稍微有點古怪,假設我們有一個parent資料夾,該資料夾有一個child子資料夾.child中有一個module a.py . 如何讓Python知道這個檔案層次結構?很簡單,每個目錄都放一個名為_init_.py 的檔案.該檔案內容可以為空.這個層次結構如下所示:

parent 
  --__init_.py
  --child
    -- __init_.py
    --a.py

b.py
那麼Python如何找到我們定義的module?在標準包sys,path屬性記錄了Python的包路徑.你可以將之打印出來:
import sys

print(sys.path)
通常我們可以將module的包路徑放到環境變數PYTHONPATH,該環境變數會自動新增到sys.path屬性.另一種方便的方法是程式設計中直接指定我們的module路徑到sys.path :
import sys
import
 os
sys.path.append(os.getcwd()+
'\\parent\\child'
)
print
(sys.path)
from import
 add_func
print
 (sys.path)
print ("Import add_func from module a"
)
print ("Result of plus is: "
)
print
 (add_func(1,2))
知識點:

 如何定義模組和包

 如何將模組路徑新增到系統路徑,以便python找到它們

 如何得到當前路徑

Python 包的相對匯入講解

兩個常見錯誤

1. ValueError: Attempted relative import in non-package​

錯誤重現
目錄樹

123456789case1/├──cat│├──__init__.py│└──cat.py├──dog│├──__init__.py│└──dog.py└──main.py

程式碼

1 2 3 # case1/cat/cat.py from..import dog

相關推薦

Python定義引入

python中的Module是比較重要的概念。常見的情況是,事先寫好一個.py文 件,在另一個檔案中需要import時,將事先寫好的.py檔案拷貝 到當前目錄,或者是在中增加事先寫好的.py檔案所在的目錄,然後import。這樣的做法,對於少數檔案是可行的,但

python定義函數的參數之四種表現形式

位置 法則 int cal typeerror bsp python pytho recent (1)def a(x,y):print x,y 這是最常見的定義方式,調用該函數,a(1,2)則x取1,y取2,形參與實參相對應,如果a(1)或者a(1,2,3)則會報錯 (2)

Python定義分頁程序

當前頁 start itl ati doc line mod 防止 分頁 為了防止XSS即跨站腳本攻擊,需要加上 safe # 路由 from django.conf.urls import url from django.contrib import

python定義異常,使用raise引發異常

value init tom 輸入 mar pri Coding pre lis 1.自定義異常類,自定義的異常類必須是Exception或者Error的子類! 1 #!/usr/bin/env python 2 # encoding: utf-8 3 4 cl

python定義封裝logging模塊

err process 文件中 elf 模式 works 日誌 pan 就是 #coding:utf-8 import logging class TestLog(object): ‘‘‘ 封裝後的logging ‘‘‘ d

Python定義阿裏雲RDS備份策略

rds備份 python 一、背景 由於越來越多的客戶對應數據安全的重視,目前阿裏雲RDS提供了備份策略,但是備份策略周期為每天的某一個時間,在日常雲運維工作中,有客戶提出需要每天在不同的時間節點多備份幾次,此時web界面就不能滿足此類在一天內多次備份的需求,但是想到了在阿裏雲web控制臺通過手動點擊

導入定義

_file__ name color clas 文件 In 路徑 bsp sys.path mypath=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #os.path.dirname 獲取文件的

python定義異常和主動拋出異常

clas 如何 pri 就是 int 異常 類繼承 def try python自定義異常和主動拋出異常 #知識點:如何自定義類 class MyException(Exception): #讓MyException類繼承Excepti

python3之定義的釋出

python3之自定義包的釋出   如果已經開發好了具備某些通用功能的模組包,恰好作者也是一個特別具有分享精神的開發人員,要將自己開發的python模組釋出出來,提供給其他人進行操作使用,類似於我們使用pygame這樣第三方模組一樣,別人也可以通過命令直接安裝使用,應該怎麼操作?

python 定義函式表示式 擬合求係數

https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html  import numpy as npimport matplotlib.pyplot as pltfrom scipy.optim

使用Python定義多執行緒,得到所有返回結果組成list

import threading import time """重新定義帶返回值的執行緒類""" class MyThread(threading.Thread): def __init__(self, func, args=()): super(MyThread,

python 定義異常

class CustomException(exceptions.Exception): def __init__(self, error_info): Exception.__init__(self, error_info) self.error = error_info def __s

Python定義大小截圖

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

AndroidStudio定義

在你的app/build.gradle下面新增 打包時間 (可選) static def releaseTime() { return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC")) } 在你的app

Python-定義裝飾器,使用裝飾器記錄函式執行次數,一種埋點的實現形式

什麼是裝飾器? 裝飾器本質是一個函式,它可以在不改變原來的函式的基礎上額外的增加一些功能。如常見的@classmethod,@staticmethod等都是裝飾器,接下來記錄下如何自定義個裝飾器: 剛剛說過了,裝飾器的本質就是一個函式,所有想要自定義一個裝飾器,首先自定義一個函式

定義元件引入報錯

問題描述:我今天寫了一個元件,該元件和引用該元件的頁面放到了相同的目錄內。 報錯資訊: 看到了這個問題,小編很鬱悶,首先想到去找度娘,發現度娘上很多人的講解很我遇到的問題的關聯不是很大。所以小編還是喜歡自己投入研究。 最後發現問題出在了元件引進的地方: 以前的引入方式:

node.js定義 的步驟

首先要自定義一個資料夾 資料夾裡面要放的目錄如下圖 lib目錄裡面放自己封裝的方法 然後在index.js(不一定要叫index.js,相當於一個集結很多方法的資料夾) 裡面引入全域性暴露的方法 在package.json裡面main屬性裡面把index.js路徑放進去 然後在需要用

定義View引入

1,第一步 首先要自己定義一個XML <?xml version="1.0" encoding="utf-8"?> <TextView android:id="@+id/tv1" android:layout_width="wrap_content

Python 定義執行緒池

"""思路1,將任務放在佇列 1)建立佇列:(初始化) 2)設定大小,執行緒池的最大容量 3)真實建立的執行緒 列表 4)空閒的執行緒數量2,著手開始處理任務 1)建立執行緒 2)空閒執行緒數量大於0,則不再建立執行緒 3)建立執行緒池的數量 不能高於

golang 多檔案與定義

新建個專案目錄,專案目錄裡的檔案package為main即可,如果是第三方包,這裡package就是為你的包名,比如說demo。 執行的話就是 go run main.go util.go 這樣,當然 go build 也ok。 還可以新建個./src/my目錄,裡面的檔案package就要