欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Python中的路徑問題

 更新時間:2020年09月02日 08:36:38   作者:張志強  
這篇文章主要介紹了Python中的路徑問題,幫助大家更好的理解和學習python,感興趣的朋友可以了解下

1. 絕對路徑引入

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

import sys
print(sys.path)

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

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

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

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

python ./cc/b.py

2. 相對路徑引用

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

from . import abc
from .abc import fool
from ..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 的路徑,但如果直接執(zhí)行腳本,這個 module 的 name 就是__main__, 而不是 module 原來的 name , 這樣相對路徑也就不是原來的相對路徑了,導入就會失敗。

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

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

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之間的嵌套關(guān)系實現(xiàn)python中包的相對導入。

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

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

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

  補充:在"from YY import XX"這樣的代碼中,無論是XX還是YY,只要被python解釋器視作package,就會首先調(diào)用該package的__init__.py文件。如果都是package,則調(diào)用順序是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

  結(jié)果:

I'm Tom's __init__!
I'm Tom's Brother!
Traceback (most recent call last):
File "D:\PythonLearning\TestIm\main.py", line 3, in <module>
from Tom import tom
File "D:\PythonLearning\TestIm\Kate\kate.py", line 4, in <module>
from .. import kate
ValueError: attempted relative import beyond top-level package
>>>

可以看到from . import tomBrother順利執(zhí)行,首先執(zhí)行了Tom文件夾下的__init__.py文件,后來執(zhí)行了tomBrother.py文件,但是當執(zhí)行到“from .. import kate”時報錯,這是因為我們是在TestIm文件夾下把main.py文件作為主函數(shù)的入口執(zhí)行的,因此盡管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

結(jié)果:  

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

即主函數(shù)入口不在TestIm中,則TestIm和其同樣包含__init__.py文件的子文件夾都被python解釋器視作package,形成相應的嵌套關(guān)系??梢哉J褂胒rom . import XXX和from .. import XXX。

以上就是詳解Python中的路徑問題的詳細內(nèi)容,更多關(guān)于Python 路徑的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python應用領(lǐng)域和就業(yè)形勢分析總結(jié)

    Python應用領(lǐng)域和就業(yè)形勢分析總結(jié)

    在本篇文章總我們給大家整理了關(guān)于Python應用領(lǐng)域和就業(yè)形勢分析以及圖文介紹,需要的朋友們可以參考下。
    2019-05-05
  • Python中._pth文件的作用及說明

    Python中._pth文件的作用及說明

    這篇文章主要介紹了Python中._pth文件的作用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • openCV實現(xiàn)圖像融合的示例代碼

    openCV實現(xiàn)圖像融合的示例代碼

    圖像融合是兩幅圖片疊加在一起,本文主要介紹了openCV實現(xiàn)圖像融合的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • python 多線程將大文件分開下載后在合并的實例

    python 多線程將大文件分開下載后在合并的實例

    今天小編就為大家分享一篇python 多線程將大文件分開下載后在合并的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Pyecharts V1和V0.5之間相互切換的方法

    Pyecharts V1和V0.5之間相互切換的方法

    這篇文章主要介紹了Pyecharts V1和V0.5之間相互切換的方法,Pyecharts這個可視化庫火爆,官方如是說:Echarts 是一個由百度開源的數(shù)據(jù)可視化,憑借著良好的交互性,精巧的圖表設計,得到了眾多開發(fā)者的認可,下面和小編一起進入文章了解具體內(nèi)容吧
    2022-02-02
  • Python中append淺拷貝機制詳解

    Python中append淺拷貝機制詳解

    在 Python 中,對象賦值實際上是對象的引用。當創(chuàng)建一個對象,然后把它賦給另一個變量的時候,Python 并沒有拷貝這個對象,而只是拷貝了這個對象的引用,我們稱之為淺拷貝,這篇文章主要介紹了Python中append淺拷貝機制,需要的朋友可以參考下
    2023-02-02
  • Python實現(xiàn)多任務版的udp聊天器

    Python實現(xiàn)多任務版的udp聊天器

    這篇文章主要為大家詳細介紹了Python實現(xiàn)多任務版的udp聊天器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • python 實現(xiàn)圖與圖之間的間距調(diào)整subplots_adjust

    python 實現(xiàn)圖與圖之間的間距調(diào)整subplots_adjust

    這篇文章主要介紹了python 實現(xiàn)圖與圖之間的間距調(diào)整subplots_adjust,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python實現(xiàn)二叉搜索樹BST的方法示例

    Python實現(xiàn)二叉搜索樹BST的方法示例

    這篇文章主要介紹了Python實現(xiàn)二叉搜索樹BST的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • Python pathlib模塊實例詳解

    Python pathlib模塊實例詳解

    本文給大家介紹了Python的pathlib 模塊,為 Python 工程師對該模塊的使用提供了支撐,讓大家了解如何使用 pathlib 模塊讀寫文件、操縱文件路徑和基礎文件系統(tǒng),統(tǒng)計目錄下的文件類型以及查找匹配目錄下某一類型文件等,需要的朋友參考下吧
    2023-05-05

最新評論