摘要:引子考慮有如下代碼結構情況其余文件為空。分析情況當我們運行時,這時候系統的搜素路徑包括,我們可以通過在中添加證實這一點。情況情況其實和情況很不一樣,情況叫做,也就是包內間接引用。顧名思義,這種引用方法只能在包內使用。都是,但不一定是。
引子
考慮有如下代碼結構
. ├── cat │?? ├── __init__.py │?? ├── cat.py │?? └── moo.py └── dog ├── __init__.py └── dog.py 2 directories, 5 files
情況1:
# ./cat/cat.py import moo
其余文件為空。如果我們用運行命令: python cat/cat.py,則程序正常運行;如果運行命令;python -m cat.cat,則會報錯;
情況2:
# ./cat/cat.py from . import moo
則運行結果相反。
其實,我們的問題早就有人提出過了。PEP 395
The fact that most methods of invoking Python code from the command line break when that code is inside a package, and the two that do work are highly sensitive to the current working directory is all thoroughly confusing for a beginner. :如果一段代碼在一個包內,那么從命令行使用這段代碼是非常非常容易出錯的,只有2種方法可行:
在整個包的外部,python -c "from module import code,
在整個包的外部,通過-m參數執行。
如果在包內部,即使你的代碼正確,也基本會出錯。
分析情況1:
當我們運行python cat/cat.py時,這時候系統的搜素路徑包括./cat/,我們可以通過在./cat/cat.py中添加import sys; print(sys.path)證實這一點。
當我們運行 python -m cat.cat時,系統的搜索路徑只包括.,也就是當前文件夾,我們可以通過在當前文件夾下添加一個moo.py文件,這樣python -m cat.cat就不會報錯了??梢姡@時的搜索空間,不包括自文件夾。
情況2:
情況2其實和情況1很不一樣,情況2叫做package relative import,也就是包內間接引用。顧名思義,這種引用方法只能在包內使用。也就是說,只能通過python -m cat.cat, 或者是python -c "from cat import cat" 之類的方法來使用。以下內容源自python官方文檔中的 The import statement
When a module or package is contained within another package ... using leading dots in the specified module or package after from you can specify how high to traverse up the current package hierarchy without specifying exact names.
官方文檔中的Package Relative Import 展示了詳細的用法。
importpython中,載入一個包有幾種方式:
import語句
importlib模塊提供的方法
內置方法__import__ (不提倡)
python中,有module,有package。package都是module, 但module不一定是package。module只有一種,package有2種。
代碼重載:importlib.reload使用importlib.reload會重載當前代碼。
import os import importlib import foo print("foo.a: {}".format(foo.a)) command = "echo a=2 >> foo.py" print(command) os.popen(command) importlib.reload(foo) print("foo.a: {}".format(foo.a))
輸出:
foo.a: 2 echo a=2 >> foo.py foo.a: 2參考資料
import 語法
PEP 395
PEP 420
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45222.html
摘要:準備工作初探,這個文章屬于自己的一個總結。所以教程面向新手,無技術含量。凡是報錯信息看到,就是表示縮進不一致。注由于原網址不方便公布,代碼中的網址全部替換為了。 準備工作 初探python,這個文章屬于自己的一個總結。所以教程面向新手,無技術含量。python環境Linux基本都有,Windows下官網也提供了便利的安裝包,怎么安裝配置網上有很多教程在此就不一一說明。我使用的pytho...
摘要:從導入相應函數,即傳入一個上一步中的類,返回對應的網頁內容,具體實現將在后續講解。后續只要去處理解析請求和響應部分即可,主程序可以不用再修改。下一篇文章編程解析請求頭 Flask或者其他框架都是封裝的比較完善,我們可以不去關注路由、SESSION等到底是怎么實現的,現在我們使用socket來實現一個帶有注冊、登錄功能的To do網站,這樣能對后端框架了解的稍微更深入一點(當然你也可以直...
摘要:以我們的程序為例,就是以為產生了一個名為的新類型,改類型的實現由給出,而就包含了通過返回的這個方法。從中找到這些類并一一執行測試。 先以一個大牛的一段關于Python Metapgramming的著名的話來做開頭: Metaclasses are deeper magic than 99% of users should ever worry about. If you wonder ...
摘要:今天要分享的是,用來寫。數據處理環節效率低下,易受干擾。問題排查難以溯源。一旦數據報告有誤,想要定位問題所在,常常需要從頭開始復盤。結果和上面結果結構是一致的。這是官網的文檔,但是卻不完全適用目前的場景。 大毛 豈安科技業務風險分析師 多年訂單業務反欺詐經驗,負責豈安科技多款產品運營工作。 上回筆者分享過一些 pandas 的常用數據查詢語法,但是數據查詢對于 pandas 而言只是冰...
閱讀 3968·2021-11-16 11:44
閱讀 5189·2021-10-09 09:54
閱讀 2031·2019-08-30 15:44
閱讀 1678·2019-08-29 17:22
閱讀 2753·2019-08-29 14:11
閱讀 3389·2019-08-26 13:25
閱讀 2324·2019-08-26 11:55
閱讀 1595·2019-08-26 10:37