簡體   English   中英

在 Python 中導入本地模塊 - ImportError: Not module named *

[英]Import a local module in Python - ImportError: Not module named *

我已經閱讀了解決方法(添加到 sys.path更強大的解決方案),但其他庫不使用此類解決方法(例如,tf 中的此文件)。 我也不希望我真的必須這樣做,我希望能夠在一行中導入並運行- 我一定錯過了一些東西!


具體來說,我有類似以下目錄的內容:

project/
  foo/
  src/
    __init__.py
    bar.py
    foo/
      __init__.py
      boo.py

我希望在 bar.py 中我可以簡單地編寫類似from foo import boo ,但是我的 IDE PyCharm 將其視為錯誤。

因此,相信我的 IDE,我嘗試from src.foo import boo但這會導致 ImportError,經測試:

Traceback (most recent call last):
  File "bar.py", line 1, in <module>
    from src.foo import boo
ImportError: No module named 'src'

我確認 src 文件夾位於sys.path[0] ,但是向它插入 __file__ 似乎確實解決了問題 - 我仍然不想使用這種解決方法,但作為最后的手段。

我已經嘗試了一百萬種其他技巧來使這個工作沒有成功。

如何在不使用其中一種解決方法的情況下從本地模塊導入?

此問題是由 PyCharm 中的錯誤引起的。 最初使用from foo import bar本能是正確的,盡管 PyCharm 有假定的錯誤,但仍會按預期工作。 它聲稱 src 是一個模塊的事實應該在我的腦海中引起警報。

可以安全地忽略 PyCharm 警告並且可以運行代碼。

為了防止 PyCharm 將來誤導我們,我們將不得不禁用“未解析的引用”檢查。 這可以通過在設置中搜索“未解析的引用”並禁用 Python 檢查來完成。

在此處輸入圖片說明

這里發生了幾件事,所以讓我們分解一下。

上層 foo 目錄混淆了 Pycharms 解析順序。 讓我們試試這個結構:

project/
  foo_1.py
  src/
    __init__.py
    bar.py
    foo_2.py

默認情況下,Pycharm 假定 project/ 在解析順序中具有優先權。 在我的示例中,如果您開始在 bar.py 中輸入“import f”,Pycharm 的自動完成將建議 foo_1 而不是 foo_2。 因此,當您導入 foo 時,Pycharm 假定它是頂級 foo 並且 boo 無法解析它。

那么為什么 Pycharm 不假設 foo_2?

假設 bar.py 有這一行:

import foo_2

如果直接運行 bar.py 它將起作用,因為 Python 將當前工作目錄添加到 Python Path。 但是,從其他任何地方調用它都會遇到麻煩。 編輯 foo_1.py 以獲得這一行:

import src.bar

直接運行 foo_1.py(這使得 CWD project/)和 bar.py 將無法找到 foo_2。 對於將使用您的包並且不使用 project/src 作為 CWD 的任何人來說,這都是一個嚴重的問題,這將是每個人。

如何解決這個問題

標准做法是在分發后命名源文件夾。 假設 'src' 是你的發行版的名稱, bar.py 應該這樣做:

import src.foo_2

規則的例外

我假設你在寫一個包。 如果 bar.py 是一個腳本,因此可能會被直接調用,那么您可以假設它每次都會成功,您應該禁用對該行的檢查:

#noinspection PyUnresolvedRefrences
import foo

暫無
暫無

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

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