电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

詳解Python中的路徑問題

瀏覽:4日期:2022-07-12 15:22:14

1. 絕對路徑引入

Python 在搜索模塊時,依次搜索sys.path里的位置,直到找到模塊為止。下面命令可以查看當前的搜索路徑:

import sysprint(sys.path)

sys.path的初始值來源于兩個(其實還有一些更復雜但不常用的)。一個是系統的PYTHONPATH變量,因此可通過設置該變量,來設置 Python 默認的搜索位置。比如:

export PYTHONPATH=/opt/python:$PYTHONPATHecho $PYTHONPATH

將該命令放在系統初始化腳本(/etc/environment)或者 BASH 初始化腳本(/~/.bashrc)里,可以對每個新開的窗口有效。

sys.path的另一個來源是當前執行程序所在的目錄 (而不是當前目錄)。比如當前目錄下文件夾./cc下有一個b.py,那么執行./cc/b.py時,./cc(而不是./!)將被加到sys.path:

python ./cc/b.py

2. 相對路徑引用

上面說的是搜索模塊都是指絕對路徑引用。對于非系統目錄,就需要操縱sys.path。但操縱sys.path有外溢效果,因為它是一個全局變量。對于同一個庫里的模塊的互相引用,可以考慮使用相對路徑:

from . import abcfrom .abc import foolfrom ..up import foo

但相對路徑有兩個很惡心的問題,使得用法極為受限。其中一個是:

Note that both explicit and implicit relative imports are based on the name of the current module. Since the name of the main module is always __main__, modules intended for use as the main module of a Python application should always use absolute imports.

包含相對路徑 import 的 python 腳本不能直接運行,只能作為 module 被引用。原因正如手冊中描述的,所謂相對路徑其實就是相對于當前 module 的路徑,但如果直接執行腳本,這個 module 的 name 就是__main__, 而不是 module 原來的 name , 這樣相對路徑也就不是原來的相對路徑了,導入就會失敗。

在使用相對引用的文件中,不能有 __main__ 方法,只執行作為一個 module 進行引用,而不是直接執行腳本。

舉個簡單例子。假設./cc/目錄下已有一個./cc/b.py(內容為空)。當前目錄下的./a.py內容為:

from .cc import b

那么直接運行python ./a.py將會報錯:

ModuleNotFoundError: No module named ’__main__.cc’; ’__main__’ is not a package

另一個是常見的錯誤是: ValueError: attempted relative import beyond top-level package。

在涉及到相對導入時,package所對應的文件夾必須正確的被python解釋器視作package,而不是普通文件夾。否則由于不被視作package,無法利用package之間的嵌套關系實現python中包的相對導入。

文件夾被python解釋器視作package需要滿足兩個條件:

1、文件夾中必須有__init__.py文件,該文件可以為空,但必須存在該文件。

2、不能作為頂層模塊來執行該文件夾中的py文件(即不能作為主函數的入口)。

補充:在'from YY import XX'這樣的代碼中,無論是XX還是YY,只要被python解釋器視作package,就會首先調用該package的__init__.py文件。如果都是package,則調用順序是YY,XX。

另外,練習中“from . import XXX”和“from .. import XXX”中的’.’和’..’,可以等同于linux里的shell中’.’和’..’的作用,表示當前工作目錄的package和上一級的package。

舉個例子:

testIm/--__init__.py--main.py : from Tom import tom--Tom/--__init__.py : print('I’m Tom’s __init__!')--tom.py : from . import tomBrother, from .. import kate,print('I’m Tom!')--tomBrother.py print(I’m Tom’s Brother!)--Kate/--__init__.py : print('I’m Kate’s __init__!')--kate.py

運行文件:main.py

結果:

I’m Tom’s __init__!I’m Tom’s Brother!Traceback (most recent call last):File 'D:PythonLearningTestImmain.py', line 3, in <module>from Tom import tomFile 'D:PythonLearningTestImKatekate.py', line 4, in <module>from .. import kateValueError: attempted relative import beyond top-level package>>>

可以看到from . import tomBrother順利執行,首先執行了Tom文件夾下的__init__.py文件,后來執行了tomBrother.py文件,但是當執行到“from .. import kate”時報錯,這是因為我們是在TestIm文件夾下把main.py文件作為主函數的入口執行的,因此盡管TestIm文件夾中有__init__.py文件,但是該文件夾不能被python解釋器視作package,即Tom package不存在上層packge,自然會報錯,相對導入時超出了最高層級的package。

修改方法:

test/--main.py : from testIm.Tom import tom--testIm/--__init__.py--Tom/--__init__.py : print('I’m Tom’s __init__!')--tom.py : from . import tomBrother, from .. import Kate,print('I’m Tom!')--tomBrother.py print(I’m Tom’s Brother!)--Kate/--__init__.py : print('I’m Kate’s __init__!')--kate.py

運行文件:main.py

結果:

I’m top’s __init__!I’m Tom’s __init__!I’m Tom’s Brother!!I’m Kate’s __init__!I’m Tom!

即主函數入口不在TestIm中,則TestIm和其同樣包含__init__.py文件的子文件夾都被python解釋器視作package,形成相應的嵌套關系。可以正常使用from . import XXX和from .. import XXX。

以上就是詳解Python中的路徑問題的詳細內容,更多關于Python 路徑的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 企业管理培训,企业培训公开课,企业内训课程,企业培训师 - 名课堂企业管理培训网 | 热回收盐水机组-反应釜冷水机组-高低温冷水机组-北京蓝海神骏科技有限公司 | 中式装修设计_全屋定制家具_实木仿古门窗花格厂家-喜迎门 | 东莞韩创-专业绝缘骨架|马达塑胶零件|塑胶电机配件|塑封电机骨架厂家 | 日本SMC气缸接头-速度控制阀-日本三菱伺服电机-苏州禾力自动化科技有限公司 | 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 | 风信子发稿-专注为企业提供全球新闻稿发布服务 | 挤出熔体泵_高温熔体泵_熔体出料泵_郑州海科熔体泵有限公司 | TPE塑胶原料-PPA|杜邦pom工程塑料、PPSU|PCTG材料、PC/PBT价格-悦诚塑胶 | 郑州巴特熔体泵有限公司专业的熔体泵,熔体齿轮泵与换网器生产厂家 | 雨燕360体育免费直播_雨燕360免费NBA直播_NBA篮球高清直播无插件-雨燕360体育直播 | 四川职高信息网-初高中、大专、职业技术学校招生信息网 | 物联网卡_物联网卡购买平台_移动物联网卡办理_移动联通电信流量卡通信模组采购平台? | 双吸泵,双吸泵厂家,OS双吸泵-山东博二泵业有限公司 | TPE_TPE热塑性弹性体_TPE原料价格_TPE材料厂家-惠州市中塑王塑胶制品公司- 中塑王塑胶制品有限公司 | 数显恒温培养摇床-卧式/台式恒温培养摇床|朗越仪器 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | TPE_TPE热塑性弹性体_TPE原料价格_TPE材料厂家-惠州市中塑王塑胶制品公司- 中塑王塑胶制品有限公司 | 荣事达手推洗地机_洗地机厂家_驾驶式扫地机_工业清洁设备 | 货车视频监控,油管家,货车油管家-淄博世纪锐行电子科技 | 特种阀门-调节阀门-高温熔盐阀-镍合金截止阀-钛阀门-高温阀门-高性能蝶阀-蒙乃尔合金阀门-福建捷斯特阀门制造有限公司 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 超细粉碎机|超微气流磨|气流分级机|粉体改性设备|超微粉碎设备-山东埃尔派粉碎机厂家 | [官网]叛逆孩子管教_戒网瘾学校_全封闭问题青少年素质教育_新起点青少年特训学校 | 英国雷迪地下管线探测仪-雷迪RD8100管线仪-多功能数字听漏仪-北京迪瑞进创科技有限公司 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 3d打印服务,3d打印汽车,三维扫描,硅胶复模,手板,快速模具,深圳市精速三维打印科技有限公司 | 书法培训-高考书法艺考培训班-山东艺霖书法培训凭实力挺进央美 | 硬质合金模具_硬质合金非标定制_硬面加工「生产厂家」-西迪技术股份有限公司 | 志高装潢官网-苏州老房旧房装修改造-二手房装修翻新 | 低合金板|安阳低合金板|河南低合金板|高强度板|桥梁板_安阳润兴 北京租车牌|京牌指标租赁|小客车指标出租 | 钢板仓,大型钢板仓,钢板库,大型钢板库,粉煤灰钢板仓,螺旋钢板仓,螺旋卷板仓,骨料钢板仓 | 众品家具网-家具品牌招商_家具代理加盟_家具门户的首选网络媒体。 | 精密冲床,高速冲床等冲压设备生产商-常州晋志德压力机厂 | 冷藏车-东风吸污车-纯电动环卫车-污水净化车-应急特勤保障车-程力专汽厂家-程力专用汽车股份有限公司销售二十一分公司 | 德国进口电锅炉_商用电热水器_壁挂炉_电采暖器_电热锅炉[德国宝] | 福州时代广告制作装饰有限公司-福州广告公司广告牌制作,福州展厅文化墙广告设计, | 成都珞石机械 - 模温机、油温机、油加热器生产厂家 | 中央空调维修、中央空调保养、螺杆压缩机维修-苏州东菱空调 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 |