python關于包的題怎么做_Python自定義包引入

python中的Module是比較重要的概念。常見的情況是,事先寫好一個.py文?件,在另一個文件中需要import時,將事先寫好的.py文件拷貝?到當前目錄,或者是在中增加事先寫好的.py文件所在的目錄,然后import。這樣的做法,對于少數文件是可行的,但如果程序數目很?多,層級很復雜,就很吃力了。有沒有辦法,像Java的Package一樣,將多個.py文件組織起來,以便在外部統一調用,和在內部互相調用呢?答案是有的。主要是用到python的包的概念,python

__init__.py在包里起一個比較重要的作用要弄明白這個問題,首先要知道,python在執行import語句時,到底進行了什么操作,按照python的文檔,它執行了如下操作:第1步,創建一個新的,空的module對象(它可能包含多個module);第2步,把這個module對象插入sys.module中第3步,裝載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?a?import?add_func?#?Also?can?be?:?import?a

print?("Import?add_func?from?module?a")

print?("Result?of?1?plus?2?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?中:importsysimportos

sys.path.append(os.getcwd()+'\\parent\\child')print(sys.path)fromaimportadd_funcprint(sys.path)print("Import?add_func?from?module?a")print("Result?of?1?plus?2?is:?")print(add_func(1,2))知識點:

如何定義模塊和包

如何將模塊路徑添加到系統路徑,以便python找到它們

如何得到當前路徑

Python 包的相對導入講解

兩個常見錯誤

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

錯誤重現

目錄樹

1

2

3

4

5

6

7

8

9case1/

├──cat

│├──__init__.py

│└──cat.py

├──dog

│├──__init__.py

│└──dog.py

└──main.py

代碼

1

2

3

# case1/cat/cat.py

from..importdog

執行

python case1/cat/cat.py

錯誤原因

python 使用一個模塊的屬性?name?來決定他在包結構中的位置,所以當直接執行 cat.py 時,name?= \’main\’,cat.py 被當作頂層模塊來處理了,自然不可能導入上層的任何對象了。

2. ValueError: Attempted relative import beyond toplevel package

錯誤重現

目錄樹

1

2

3

4

5

6

7

8

9

10

11case2/

├──cat

│├──__init__.py

│├──cat.py

│└──cat.pyc

├──dog

│├──__init__.py

│└──dog.py

├──__init__.py

└──main.py

代碼

1

2

3

4

5

6

# case2/cat/cat.py

from..importdog

# case2/main.py

importcat.cat

執行

python case2/main.py

錯誤原因:

這里的 case2 是一個包,但當你直接執行 main.py 的時候,就沒有把完整的 case2 當作一個包來處理了,可想而知,下層的 cat.py 自然找不到上層包了。即想要相對導入成功,必須讓下層的被導入對象是上層包或上層包內的對象。

正確執行的例子

目錄樹

1

2

3

4

5

6

7

8

9

10

11

12case3/

├──alpaca.py

├──main.py

└──pets

├──__init__.py

├──cat

│├──__init__.py

│└──cat.py

└──dog

├──__init__.py

└──dog.py

代碼

1

2

3

4

5

6

7

# case3/pets/cat/cat.py

from..dogimportdog

from..importdog

# case3/main.py

frompets.catimportcat

執行

python case3/main.py

請注意,這里的 cat.py 中是不能導入 alpaca 的,因為 pets 已經是這個包樹的頂層了。

另外一篇:

python的相對路徑導入問題

用python做項目,如果項目大了,或者想更好的管理程序,總是要使用包。包解決了命名沖突的問題。

今天在使用python的相對路徑導入的時候,遇到了不少的問題。

包導入情形:

1

2

3

4

5

6

7

8

9

10

11

src/

__init__.py

main.py

components/

__init__.py

expander.py

language_id.py

utilities/

__init__.py

functions.py

如果要在expander.py中引用functions.py中的內容,或許這樣表示

from ..utilities import functions.py

1.錯誤一:ValueError:Attemptedrelative import beyond toplevel package

這個問題是因為到達了包的最頂層,而最頂層不是一個包。

解決方法:在main.py同級添加一個目錄mod,包含components和utilities,并在mod中添加一個init.py,即可解決

參見:http://stackoverflow.com/questions/4175534/relative-imports-in-python

2.錯誤二:ValueError: Attempted relative import in non-package

使用相對路徑進行導入的文件,不能再當作主文件執行。原因如下:

http://blog.csdn.net/chinaren0001/article/details/7338041

3.錯誤三:no module named ***

在指定路徑下沒有找到該模塊。

另外:在main.py執行的時候,沒有指定路徑的文件默認與main.py是同一路徑。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394326.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394326.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394326.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

汽車之家的安全框架,是如何從0到1搭建的?

“別人家的安全”是安全威脅情報(微信ID:Threatbook)近期推出的一檔專欄。 合規、管理、構建、應急……安全問題千千萬,層出不窮。我們沒辦法給出這些問題的標準答案,但我們可以用Case Study的形式,讓你看看…

leetcode264. 丑數 II

編寫一個程序,找出第 n 個丑數。 丑數就是質因數只包含 2, 3, 5 的正整數。 示例: 輸入: n 10 輸出: 12 解釋: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 個丑數。 說明: 1 是丑數。 n 不超過1690。 解題思路 直接用treeset去重和排序 代碼 class Solution …

vr多人_如何構建多人VR網絡應用

vr多人by Srushtika Neelakantam通過Srushtika Neelakantam 如何構建多人VR網絡應用 (How to build a multiplayer VR web app) In this article, we’ll learn about three great frameworks/libraries that allow any web developer to build a VR app that works on any de…

量子測量 -- 確定性的死神

一、測量 -- 確定性的死神 前文已反復提及在量子世界中測量這一過程會產生很多奇異的、反直覺的現象。在第一篇文章中我舉的例子是:用同樣的配方,同樣的火候,同樣的廚具(所有你能想到的變量均相同)煎雞蛋,結…

python增刪改查csv文件_Python--作業2--對員工信息文件,實現增刪改查操作

#!/usr/bin/env python#-*- coding:utf-8 -*-#Author:Huanglinshengimportos#查詢方式一:select * from data_staff.txt where age > 22#查詢方式二:select * from data_staff.txt where dept "IT"#查詢方式三:select * from d…

ios注銷所有通知_您一直想了解的有關iOS中通知的所有信息

ios注銷所有通知by Payal Gupta通過Payal Gupta 您一直想了解的有關iOS中通知的所有信息 (Everything you’ve always wanted to know about notifications in iOS) 漂亮的小警報..? (Pretty Little Alerts..?) Notifications are a way to inform users when new…

vue-x

https://my.oschina.net/wangnian/blog/2055631轉載于:https://www.cnblogs.com/ylblogs/p/10694849.html

leetcode97. 交錯字符串(動態規劃)

給定三個字符串 s1, s2, s3, 驗證 s3 是否是由 s1 和 s2 交錯組成的。 示例 1: 輸入: s1 “aabcc”, s2 “dbbca”, s3 “aadbbcbcac” 輸出: true 解題思路 數組含義:dp[i][j]s1的前i個和s2的前j個能否組成字符串s3的前ij長度的子串 狀態轉移: d…

【LeetCode】19. Remove Nth Node From End of List

Given a linked list, remove the nth node from the end of list and return its head. For example, Given linked list: 1->2->3->4->5, and n 2.After removing the second node from the end, the linked list becomes 1->2->3->5.題意:…

《網絡空間欺騙:構筑欺騙防御的科學基石》一1.1 主動網絡空間防御中網絡空間抵賴與欺騙的視圖...

1.1 主動網絡空間防御中網絡空間抵賴與欺騙的視圖 本文講的是網絡空間欺騙:構筑欺騙防御的科學基石一1.1 主動網絡空間防御中網絡空間抵賴與欺騙的視圖,將抵賴與欺騙納入標準操作規程(SOP):隨著攻擊技術的不斷演進,網…

管樁的彈性模量計算公式_樁基設計計算公式

0.9300.71555.31201018001.130973355樁長21.3mN(KN)φfc(kN/m2)Ap(m2)f’s(kN/m2)A’s(m2)樁直徑(m2)11518.963620.7119001.1309733553000000.0160849541.2標準值19006.29KN單樁承載力設計計算(建筑樁基技術規范08版)根據《建筑樁基技術規范》(JGJ94—2008), 單樁豎向極限承載力…

python函數的作用降低編程復雜度_Python語言程序設計 (第11期) 測驗5: 函數和代碼復用...

共10道單選題和2道編程題,限答1次、限時50分鐘選擇題1.以下選項不是函數作用的是:???????????????????????????????????????????????????????????????????????????????…

restful解決什么問題_當您陷入RESTful,WordPress和一個困難的地方時,如何解決CMS問題...

restful解決什么問題by Jessica Duffin Wolfe杰西卡達芬沃爾夫(Jessica Duffin Wolfe) 當您陷入RESTful,WordPress和一個困難的地方時,如何解決CMS問題 (How to solve a CMS problem when you’re caught between RESTful, WordPress, and a hard place…

InfluxDB的HTTP API寫入操作

一、說明 為了方便,本文主要使用curl來發起http請求,示例當中也是使用curl這個工具來模擬HTTP 請求。 在實際使用中,可以將請求寫入代碼中,通過其他編程語言來模擬HTTP請求。 二、InfluxDB通過HTTP API操作數據庫 1)建…

揭開勒索軟件的真面目

一、前言 2013年9月,戴爾公司的SecureWorks威脅應對部門(CTU)發現了一種名為“CryptoLocker”的勒索軟件,它以郵件附件形式分發,感染計算機并加密近百種格式文件(包括電子表格、數據庫、圖片等)…

leetcode486. 預測贏家(動態規劃)

給定一個表示分數的非負整數數組。 玩家1從數組任意一端拿取一個分數,隨后玩家2繼續從剩余數組任意一端拿取分數,然后玩家1拿,……。每次一個玩家只能拿取一個分數,分數被拿取之后不再可取。直到沒有剩余分數可取時游戲結束。最終…

w550官方例程_急!求索愛w550的刷機所需要的所有文件! 全部分送上!

展開全部W550c行貨軟件升級使用國內行貨W550c手機的朋友,將來是可以在62616964757a686964616fe58685e5aeb931333238646330官方網站使用隨機數據線免費升級的,目前W550c的最新版本是R4AB048但是由于目前官方網站還未提供,大家敬請期待。W550c索…

python的xpath用法介紹_python爬蟲之xpath的基本使用詳解

本篇文章主要介紹了python爬蟲之xpath的基本使用詳解,現在分享給大家,也給大家做個參考。一起過來看看吧一、簡介XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進行遍歷。XPath 是 W3C XSLT 標準的主要元素&#xff…

楊波 微服務技術專家_專家稱,這些是最有效的微服務測試策略

楊波 微服務技術專家by Jake Lumetta杰克盧米塔(Jake Lumetta) 專家稱,這些是最有效的微服務測試策略 (These are the most effective microservice testing strategies, according to the experts) Testing microservices is hard. More specifically, end-to-end…

LRU算法實現

LRU是Last Recent Used 縮寫,做為一種緩存算法,將最近較少使用的緩存失效。memcache采用了該算法。如下采用了一種PHP的實現方式。該算法將每次新增的內容,放到緩存頂部,達到緩存極限時,將緩存底部的內容清除。可以通過…