簡體   English   中英

為什么 python 會混淆我的模塊包

[英]Why does python confuse my packages for modules

我在根 package 中有一個包含 3 個嵌套包的項目

clsgen 
-__init__.py
-main.py
-parsing
    -__init__.py
    - class1.py
    - class2.py
-generator
    -__init__.py
    -some_class_files
    -...
-utils
    -__init__.py
    -some_modules
    -...

在導入和使用包時,我遇到了很多困難(通常是 python——在我看來,這可能是 Java/Eclipse 唯一正確的做法)。 最近,我可以通過使用類似from.details import Details的相對導入來滑冰:從當前包/目錄中的一個模塊,稱為 details,導入名為“Details”的 class。 我為程序添加了一些新的(可能是破壞性的)更改,現在,上面相同的相對導入行不再起作用。 似乎解釋器認為我的包是模塊,所以我不能使用絕對導入。

例如,如果我將導入更改為:

from parsing.details import Details

我收到此錯誤:

>>> %Run class_dict.py
Traceback (most recent call last):
  File "C:\Users\Ben\VsCode\python\classgenerator\parsing\class_dict.py", line 12, in <module>
    from parsing.details import Details
  File "C:\Users\Ben\AppData\Local\Programs\Thonny\lib\site-packages\thonny\backend.py", line 305, in _custom_import
    module = self._original_import(*args, **kw)
ModuleNotFoundError: No module named 'parsing'

我什至嘗試根據需要覆蓋內置package ,例如

__package__ = "parsing"
from parsing.details import Details

我非常有信心我的項目打包結構設置正確(如上面的第一個示例所示(但更詳細))。 而且我也非常有信心我理解包、模塊、相對導入和絕對導入的概念。 然而,每當我嘗試使用 Python 制作多 package 程序時,這個問題一直困擾着我。 我非常感謝有人指出錯誤或建議我可以采取哪些措施來緩解這個持續存在的問題。

在 Java 中,進口只是語法糖(不是真的)。 在 python 中,它們是實際語句,它們是根據涉及 sys.path 變量和當前工作目錄的復雜規則來解析的。 運行位於 package 中的 python 腳本(又名模塊)的正確方法是:

$ C://path//to//python//interpreter.exe -m packagename.modulename

所以在你的情況下

$ cd "C:\Users\Ben\VsCode\python\"
$ C://path//to//python//interpreter.exe -m classgenerator.parsing.class_dict

這樣相對導入被正確解析,因為“C:\Users\Ben\VsCode\python”被自動添加到 sys.path 和 python 掃描它找到 package 類生成器子包解析

暫無
暫無

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

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