簡體   English   中英

在python庫中導入模塊的正確方法是什么?

[英]What is the correct way to import modules in python library?

當您編寫一個python庫並想要從另一個庫中導入一個模塊時,正確的方法是什么,以便從外部導入庫以及從庫目錄運行某些單元測試時導入都可以工作?

如果你這樣做

import some_module
from some_module import something

ImportError: No module named 'some_module'庫運行時,它可以工作,但從外部ImportError: No module named 'some_module'時,會產生ImportError: No module named 'some_module'

你可以做

from . import some_module
import my_library.some_other_module
from .some_module import something

但是如果您從位於同一目錄中的unittest導入庫,則將無法使用。

最后,您可以使用sys.path和/或將單元測試移動到其他目錄。

最好的解決方案是什么?

編輯:為了清楚起見,我想在庫的頂層目錄中使用python -m unittest運行unittests。 到目前為止,我通過添加使它起作用

import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

到單元測試文件的開頭。 另外,也可以編寫一個簡短的Shell腳本,將父目錄添加到PYTHONPATH ,然后運行unittests。 我想知道是否有更好的方法來應對?

看看有關模塊搜索路徑的文檔

導入名為spam的模塊時,解釋器首先搜索具有該名稱的內置模塊。 如果找不到,它將在變量sys.path給出的目錄列表中搜索名為spam.py的文件。 sys.path從以下位置初始化:

  • 包含輸入腳本的目錄(或當前目錄)。
  • PYTHONPATH(目錄名稱列表,語法與shell變量PATH相同)。
  • 取決於安裝的默認值。

如果編寫庫,則測試代碼通常應以與庫用戶相同的方式與庫交互。 這可能意味着可以通過設置PYTHONPATH環境變量,或者通過將模塊安裝在默認的第三方模塊位置中來將模塊添加到搜索路徑中。

我建議從使用自動測試發現選項保存模塊的基本目錄中運行測試

python -m unittest discover (python >= 2.7)

這將遞歸地找到與test_*.py匹配的文件(即在模塊目錄中),但應設置相對於父目錄的python路徑。

暫無
暫無

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

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