簡體   English   中英

在python中導入外部模塊的最佳實踐

[英]Best practice for importing external module in python

讓我通過一個簡化的例子來問這個問題。 假設我在一個目錄中有一個名為 example.py 的 python2 腳本,其中包含我編寫的另一個名為 utils.py 的腳本。 在example.py中,我需要導入一個放置在路徑/A/B/external.py下的外部模塊。 'A' 和 'B' 只是文件夾,而不是包(沒有 __ init__.py)。 最后假設/A/B/下也有一個utils.py文件,是external.py導入的。

如果我按照我熟悉的方式導入外部模塊,我會這樣做:

import sys
sys.path.append('/A/B/')
import external

問題是,當我嘗試導入我的utils 模塊時,python 會在 sys.modules dict 中找到它(因為外部導入了它),因此不會導入我的腳本,而只會導入 /A/B 下已經存在的腳本進口的。

現在,有解決方法。 我可能會更改模塊的名稱,或者將外部模塊放在一個包中等等。但所有這些都感覺很臟。 我找不到做這些事情的“pythonic”最佳實踐是什么。 正如你們中的一些人可能猜到的那樣,在更復雜的情況下,它可能會導致非常煩人的錯誤。 另外,PEP8 不接受我熟悉的方式,因為模塊頂部沒有導入命令。

總之,我正在尋找做這些事情的最佳實踐,謝謝。

雖然已經過去了將近兩年,但我想描述一下我現在理解的正確答案。 TL;DR:最好的方法是完全避免操作sys.path (!),而是使用分發打包機制。

首先,讓我們區分分發包和導入包。 一個import-package基本上是一個包含 pythonic 模塊(即 .py/.pyc 文件)和一個__init__.py文件的目錄,用於聲明這個文件夾確實是一個包。 在問題的示例中,這是包含example.pyutils.py的目錄。 與此相反,分發包是:

包含 Python 包、模塊和其他用於分發版本的資源文件的版本化存檔文件。

來源: PyPA 用戶指南詞匯表

另一個應該知道的術語是腳本 python 腳本是__main__ python 文件,它直接通過解釋器運行(而其他 python 文件稱為modules )。 來源: python 的文檔

在您自己的導入包中,您不應編輯sys.path因為腳本文件會根據其文件的位置導入模塊,而這正是所需的行為。 如果您打算使用導入包外部的另一個模塊(並且讓我明確表示,您從當前導入包內的另一個導入包導入的情況並非如此,這是正常行為並且運行良好),那么您應該將其作為已安裝的分發包導入。

我的意思是,外部代碼(在示例中,位於 A/B/ 下的 external.py 模塊)應該作為分發包提供(它的維護者應該將它作為一個包上傳到某個發行版機制,即PyPi ,這很可能是您,但作為另一個包開發人員)。 然后 - 您作為外部包用戶應該安裝它(例如在該外部分pip install的輪文件上使用pip install ),然后它將由您的環境添加和管理,以便您可以import external並且它可以在沒有沖突的情況下工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM