簡體   English   中英

Python 出現導入錯誤,我不明白為什么

[英]Python gives a Import Error and i don't understand why

我仍在學習如何更好地使用 Python 編寫代碼。 因此我試圖在我的編程中使用一些結構。 諸如 name_conventions 和結構化包裝和模塊之類的東西。

也就是說,我遇到了一個我無法解決的問題,似乎。 我選擇的結構如下:

    • __init__.py
    • 控制器.py
  • 儀表盤
  • 日志
  • 插件
    • 統計數據
      • __init__.py
      • 控制器.py
    • 插件2
    • 插件3
    • 等等..
  • 主文件

在 Core controller.py 中,我試圖導入 Stats(object) 類。 我嘗試了幾種不同的方法。 在我的 IDE (Pycharm) 中,它就像一個魅力 ;) 當我嘗試通過命令行啟動它時,我得到了 ImportErrors。 我嘗試了不同的方法。

from Plugins.Stats.controller import Stats

from Plugins.Stats import controller

from Plugins.Stats import controller.Stats

from Plugins import Stats.controller

我還嘗試將Stats類放入Plugins.Stats.__init__.py並調用它:

from Plugins.Stats import Stats

我明白了:

Traceback (most recent call last):
  File "controller.py", line 4, in <module>
    from Plugins.Stats.controller import Stats
ImportError: No module named 'Plugins'

有趣的是......當我嘗試從main.py做同樣的事情時。 它確實有效。 所以我真的很困惑。 難道我做錯了什么?

是否還有特殊的設計模式來處理進口?

您還應該在 Plugins 目錄中添加__init__.py文件,使其看起來像

  • 插件
    • __init__.py
    • 統計數據
      • __init__.py
      • 控制器.py

您可以在此處閱讀有關 Python 模塊的更多信息 - 查看6.4。 套餐


您還可以通過將您要導入的模塊添加到 pythonpath 中,使每個人都可以看到它

sys.path.append("/path/to/main_folder")

在此模塊位於另一個命名空間之前

你會在這里找到更多信息

首先把From plugin import stats ,然后from stats import controllerimport _init_

如果從終端運行,它只會嘗試從當前文件夾導入。 您必須在文件開頭使用以下代碼手動將主文件夾的路徑添加到此文件

import sys

sys.path.append("../")

如果要備份 2 個文件夾,請添加 ../../ 而不是 ../

您不應該直接將包的子模塊作為腳本啟動。 大多數時候這會弄亂你的層次結構。 而是將其稱為模塊:

python -m Core.controller

您可以通過將其添加到任何腳本的頂部來驗證以下內容:

import sys
for p in sys.path:
    print(repr(p))

調用時導入工作的原因如下:

python main.py

is python 會將腳本的目錄添加到 pythonpath (在這種情況下為空字符串''

但是,運行時

python Core/controller.py

它會將Core添加到sys.path ,使項目的其余部分無法sys.path

您可以改為使用

python -m Core.controller

runpy使用runpy調用並再次將空字符串放在 python 路徑上。

您可以在此處閱讀有關 python 解釋器調用選項的更多信息: https ://docs.python.org/2/using/cmdline.html 您可以在此處閱讀有關 runpy 的信息: https ://docs.python.org/2/library /runpy.html

暫無
暫無

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

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