從父目錄導入 Python:快速指南

從父目錄導入 Python:快速指南

是否曾發現自己深陷 Python 文件中,難以從父目錄導入模塊?如果是這樣,那麼您的公司很好。Python 的導入系統有時感覺就像一個蜿蜒的迷宮,但別擔心,我們會幫你導航!

要從 Python 中的父目錄導入,可以使用sys模塊。通過將所需目錄插入 sys.path 列表,您可以為解釋器提供所需模塊的位置。修改 sys.path 後,可以使用標準的 import 語句導入目標模塊。

從父目錄導入 Python:快速指南

在本文中,我們將探討如何在 Python 中從父目錄導入。此外,我們將查看導入的具體用例,這將幫助您更好地理解目錄的底層結構。

讓我們開始吧!

目錄

如何在 Python 中導入

我們將直接進入今天的主題:在 Python 中導入。Python 腳本開頭的那些簡單代碼行通常以importfrom ? 這些是您利用 Python 豐富的庫和模塊的門票。

在本節中,我們將回顧在 Python 中從父目錄導入的代碼。我們還將研究從父目錄導入模塊時可能出現的潛在錯誤。

什麼是 Python 導入系統?

Python 導入系統允許高效的代碼重用和組織。它使您更容易維護複雜的項目。

要在 Python 中導入模塊或包,可以使用import語句。模塊作為包分發,包是包含 Python 文件集合的目錄。

要從父目錄導入模塊,可以使用sys.path模塊將父目錄添加到 Python 的路徑中。添加父目錄後,您可以使用import語句導入模塊。

從父目錄導入演示

為了清楚地演示從父目錄導入,讓我們通過一系列步驟來幫助您理解整個過程。

1.創建必要的目錄和文件

首先,打開文件資源管理器並導航到所需的本地驅動器。我正在使用我的本地 E 驅動器,因此,我將創建一個名為my_project的新目錄。

my_project中,創建另一個名為module_dir的目錄。

所以,你現在應該有:

E:
|-- /my_project
    |-- /module_dir

2.添加Python文件

接下來,在my_project目錄中創建一個名為main.py的新.py文件。

之後,在module_dir中創建另一個名為my_module.py的 Python 文件。

您的結構現在應該如下所示:

E:
|-- /my_project
    |-- main.py
    |-- /module_dir
        |-- my_module.py

如果您使用的是Visual Studio Code,您的目錄結構應如下所示:

從父目錄導入 Python:快速指南

3. 編輯 Python 文件

打開您的my_module.py並添加以下代碼:

def my_function():
    print("Hello from my_module!")

然後繼續保存並關閉文件。

現在,打開main.py並添加以下代碼:

import sys
import os

# Get the parent directory
parent_dir = os.path.dirname(os.path.realpath(__file__))

# Add the parent directory to sys.path
sys.path.append(parent_dir)

# Import the module from the parent directory
from module_dir import my_module

# Use a function from my_module
my_module.my_function()

在此腳本中,我們首先確定我們正在運行的腳本的上一級目錄(即父目錄)的位置。然後,我們告訴 Python 在需要導入模塊時也查看這個父文件夾。

這樣做之後,我們將導入一個名為my_module的模塊,該模塊位於該父目錄中名為module_dir的目錄中。最後,我們從my_module調用一個名為my_function的函數。

添加以上代碼後,保存並關閉文件。

4.運行代碼

要運行此代碼,請打開所需代碼編輯器的終端並運行main.py文件。如果您使用的是 Visual Studio Code,則輸出應如下所示:

從父目錄導入 Python:快速指南

main.py將從my_module.py導入函數如上圖所示。

此示例詳細說明文件系統和從父目錄導入如何在 Python 中工作。

如何在 Python 中處理 ImportError 和 ModuleNotFoundError

如果在導入過程中找不到您嘗試導入的模塊,Python 將引發ImportError異常。

ImportError是ModuleNotFoundError異常的子類。當導入的模塊不存在或無法加載時引發。

以下是可能發生這些情況的示例:

  • 模塊或包不在 sys.path

  • 模塊或包名稱拼寫錯誤或不存在。

  • 模塊代碼存在問題,導致無法正確導入。

遇到這些錯誤時,您可以使用以下解決方案:

  • 仔細檢查模塊或包的拼寫和存在。

  • 使用append()insert()將必要的目錄添加到sys.path

  • 修復模塊代碼中可能阻礙其導入的任何問題。

要了解有關在 Python 中處理錯誤的更多信息,請觀看以下視頻:

在了解導入在 Python 中的工作方式之後,熟悉 Python 的目錄結構也很重要。

目錄結構和導入是密不可分的,因為導入需要了解目錄結構,所以讓我們在下一節中討論一下。

目錄結構

了解 Python 目錄結構不僅僅是知道將腳本放在哪里或在哪裡可以找到剛剛安裝的庫。

這就像擁有一張乾淨、井井有條的辦公桌:您會確切地知道所有東西在哪裡,並且您的工作效率會飆升,所以讓我們在本節中回顧一下基礎知識。

封裝結構

Python 項目的目錄結構對於正確組織至關重要。如果你正確地構建你的包,它會幫助你最小化命名衝突的機會。此外,它還使您能夠輕鬆瀏覽文件系統。

下面是一個典型的Python項目目錄結構:

project/
?
??? package1/
?   ??? __init__.py
?   ??? module1.py
?   ??? module2.py
?
??? package2/
?   ??? __init__.py
?   ??? module3.py
?   ??? module4.py
?
??? main.py

在上面的示例中,project是包含兩個子包package1package2的根目錄。每個包都有自己的.py文件和一個唯一的init.py文件。

什麼是 init.py 文件?

init.py文件對於定義包在導入時的行為很重要。這些文件在導入它們的父包時執行。

init.py文件可以為空或包含初始化代碼。它們還向 Python 指示該文件夾應被視為一個包。

要從父目錄導入模塊,可以使用sys.path方法。您需要將父目錄路徑附加到sys.path

為了證明這一點,讓我們在前面的示例的基礎上進行構建。我們有以下目錄結構:

E:
|-- /my_project
    |-- main.py
    |-- /module_dir
        |-- my_module.py

現在,讓我們將init.py文件添加到my_module目錄。您現在可以將此文件留空。它的存在向 Python 表明該目錄應該被視為一個包。

您的目錄結構現在應該如下所示:

從父目錄導入 Python:快速指南

添加init.py文件後,您必須更改main.py文件以指示它將module_dir文件夾視為一個包。您的main.py文件現在應該包含以下代碼:

import sys
import os

# Get the parent directory
parent_dir = os.path.dirname(os.path.realpath(__file__))

# Add the parent directory to sys.path
sys.path.append(parent_dir)

# Import my_module from the package module_dir
import module_dir

# Call my_function from my_module
my_module.my_function()

在此示例中,main.py導入module_dir包,然後從該包中的 my_module 調用函數my_function()

注意對my_function調用的變化;因為我們現在將module_dir視為一個包,所以在從包中的模塊調用函數時必須包含包名稱。

輸出將與上一個類似。我們所做的唯一更改是將module_dir視為包含init.py文件的包。

從父目錄導入 Python:快速指南

Python 搜索路徑

有沒有想過 Python 如何知道在哪裡可以找到您要導入的模塊?或者,也許您遇到了一個煩人的“ModuleNotFoundError”並且無法弄清楚原因?

在本節中,我們將直面這些謎團並深入研究 Python 搜索路徑的概念。

Python 搜索路徑,也稱為sys.path,是 Python 用於查找您需要的所有模塊的小路線圖。就像一個勤奮的偵察員,每當您使用 import 語句時,Python 都會使用此路徑來搜索您的計算機以查找模塊。

了解它的工作原理可以讓您免於頭痛并幫助您在出現問題時進行故障排除,所以讓我們回顧一些基礎知識!

1. Python中的sys.path List是什麼?

sys.path列表是在目錄中導入模塊時的關鍵組件。它是表示模塊搜索路徑的字符串列表。

列表中的每個字符串都是一個目錄位置,Python 在其中查找模塊(*.py文件)或包(包含init.py文件的文件夾)。

以下示例向您展示瞭如何查看當前的sys.path列表:

import sys

for path in sys.path:
    print(path)

運行上面的代碼後,您將看到如下輸出:

從父目錄導入 Python:快速指南

您還可以將新目錄添加到sys.path列表,以便 Python 找到您的自定義模塊。

例如:

import sys
sys.path.append('/path/to/new/module/directory')

2.什麼是PythonPath環境變量?

管理模塊搜索路徑的另一種方法是使用PYTHONPATH環境變量。

PYTHON PATH是一個字符串,其中包含附加到默認sys.path列表的目錄列表。這意味著您可以將目錄添加到PYTHONPATH。這允許 Python 在導入時在這些目錄中搜索模塊。

設置PYTHONPATH環境變量取決於您的操作系統:

  • 基於 Unix 的系統(Linux、macOS):您可以在終端中使用導出命令或將以下行添加到您的 shell 配置文件(.bashrc.zshrc或類似文件):

    export PYTHONPATH="/path/to/module/directory1:/path/to/module/directory2"
  • Windows 操作系統:轉到System Properties > Environment Variables,然後在User variables下,單擊New以創建一個新變量,其名稱為:“PYTHONPATH”,其值為由分號 (;) 分隔的目錄路徑列表。

    C:pathtomoduledirectory1;C:pathtomoduledirectory2
    

設置路徑變量後,您可以運行 Python 腳本。它將在這些目錄中搜索導入的模塊以及sys.path中的默認模塊。

在將代碼組織到文件和文件夾中時,您會經常遇到相對導入和調整sys.path的情況。

在下一節中,我們將探討兩者並了解它們如何適合 Python 導入的框架。

父目錄導入

您可以將代碼組織到不同的文件夾和文件中,以提高可讀性和可維護性。但是,從父目錄導入模塊可能有點棘手。

在本節中,我們將討論實現此目的的兩種方法:

  1. 相對進口

  2. 調整系統路徑

1. 相對進口

相對導入允許您根據模塊在目錄層次結構中的相對位置導入模塊。

您可以使用點 ( . ) 符號來引用當前目錄或雙點 ( .. ) 符號來引用父目錄。

假設您有如下目錄結構:

parent_directory/
?
??? module_a.py
?
??? sibling_directory/
    ??? module_b.py

在module_b.py中,您可以使用相對導入來訪問module_a.py

from .. import module_a

雙點指的是父目錄。重要的是要注意相對導入僅在父目錄是包(具有init.py文件)時才有效。

2.調整sys.path

您還可以通過修改sys.path從父目錄導入模塊。

在import語句之前,您可以將父目錄路徑附加到sys.path。首先,您需要導入sys模塊。然後,您使用os模塊獲取父目錄路徑。

假設您有如下目錄結構:

project_root/
?
??? parent_directory/
?   ??? module_a.py
?
??? current_directory/
    ??? module_b.py

module_b.py中,您可以將父目錄路徑附加到sys.path,如下所示:

import os
import sys

parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(parent_dir)

import module_a

現在,Python 在將module_a.py導入到module_b.py時會在父目錄中查找它。

您可以使用相對導入方法或sys.path方法從父目錄導入模塊。

如何使用模塊和包

在 Python 中,模塊和包是一種組織和重用代碼的方式。您可以使用它們將復雜的項目拆分為可管理的部分。

本節將討論如何在Python中使用模塊和包。我們還將包括關鍵概念,例如:

  1. 命名空間

  2. 變量和定義

  3. 進口報表

1. 什麼是命名空間?

Python 中的命名空間是一種確保變量、函數和類的名稱在不同模塊之間不衝突的方法。

Python中有不同級別的命名空間,例如:

  • Global Namespace:指整個模塊的命名空間。

  • 本地命名空間:指函數或類內的命名空間。

您可以使用namespace[name]表示法獲取特定命名空間中的名稱。

2. 什麼是變量和定義?

在 Python 腳本中,您可以定義變量、函數和類。這些定義存儲在腳本的命名空間中。

通過將腳本作為包導入,您可以在項目的其他部分訪問和重用它的定義。

以下是如何在同一個命名空間中定義變量和函數的示例:

# my_variable.py
my_variable = 5

def my_function(x):
    return x + my_variable

這個模塊有一個變量my_variable和一個函數my_function

要運行此代碼,您可以創建一個名為my_variable.py的新文件並將代碼放在那裡,如下所示:

從父目錄導入 Python:快速指南

現在,您可以導入此文件並在另一個腳本中使用它,如下所示:

從父目錄導入 Python:快速指南

運行main.py文件後,您將獲得類似於以下內容的輸出:

從父目錄導入 Python:快速指南

3. 什麼是進口報表?

您可以使用import語句在 Python 中導入文件、模塊或包

一些常見的導入方法是:

  • import module_name:此方法導入一個模塊,使其所有定義都可以使用module_name.definition_name表示法訪問。

import mymodule

result = mymodule.my_function(3)
  • from module_name import some_definition:此方法從模塊中導入特定定義,允許您直接使用它而無需模塊前綴。

from mymodule import my_function

result = my_function(3)
  • from module_name import *:此方法從模塊導入所有定義,但不推薦,因為它會導致命名衝突。

最後的想法

了解如何從 Python 中的父目錄導入對於維護有組織的代碼庫很重要。

這些知識使您能夠以更加模塊化的方式設計您的項目。它還增加了代碼的可重用性。通過將代碼結構化為單獨的模塊和包,可以避免重複代碼並使其更易於維護和更新。

當您處理功能分散在不同目錄中的大型項目時,使用importfrom語句的技能最有價值。

通過了解如何正確調整 Python 導入模塊的路徑,您可以在另一個目錄中工作時訪問一個目錄中定義的功能。

請記住,掌握 Python 或任何編程語言的關鍵在於始終如一的實踐和永不滿足的好奇心。所以,不斷探索,不斷嘗試,不斷挑戰自己。

有了這個快速指南,您應該能夠很好地處理 Python 拋給您的任何導入難題。但不要停在這裡。有一整套 Python 技術和技巧等待被發現!


什麼是 Python 中的自我:真實世界的例子

什麼是 Python 中的自我:真實世界的例子

什麼是 Python 中的自我:真實世界的例子

如何在 R 中保存和加載 RDS 文件

如何在 R 中保存和加載 RDS 文件

您將學習如何在 R 中保存和加載 .rds 文件中的對象。本博客還將介紹如何將對像從 R 導入 LuckyTemplates。

回顧前 N 個工作日——DAX 編碼語言解決方案

回顧前 N 個工作日——DAX 編碼語言解決方案

在此 DAX 編碼語言教程中,了解如何使用 GENERATE 函數以及如何動態更改度量標題。

在 LuckyTemplates 中使用多線程動態視覺技術展示見解

在 LuckyTemplates 中使用多線程動態視覺技術展示見解

本教程將介紹如何使用多線程動態可視化技術從報告中的動態數據可視化中創建見解。

LuckyTemplates 篩選上下文簡介

LuckyTemplates 篩選上下文簡介

在本文中,我將貫穿過濾器上下文。篩選上下文是任何 LuckyTemplates 用戶最初應該了解的主要主題之一。

使用 LuckyTemplates 在線服務中的應用程序的最佳技巧

使用 LuckyTemplates 在線服務中的應用程序的最佳技巧

我想展示 LuckyTemplates Apps 在線服務如何幫助管理從各種來源生成的不同報告和見解。

隨著時間的推移分析利潤率變化——使用 LuckyTemplates 和 DAX 進行分析

隨著時間的推移分析利潤率變化——使用 LuckyTemplates 和 DAX 進行分析

了解如何在 LuckyTemplates 中使用度量分支和組合 DAX 公式等技術計算利潤率變化。

DAX Studio 中數據緩存的物化想法

DAX Studio 中數據緩存的物化想法

本教程將討論數據緩存物化的想法,以及它們如何影響 DAX 在提供結果時的性能。

使用 LuckyTemplates 進行業務報告

使用 LuckyTemplates 進行業務報告

如果直到現在你還在使用 Excel,那麼現在是開始使用 LuckyTemplates 來滿足你的業務報告需求的最佳時機。

什麼是 LuckyTemplates 網關?所有你必須知道的

什麼是 LuckyTemplates 網關?所有你必須知道的

什麼是 LuckyTemplates 網關?所有你必須知道的