Python import acting strange (只能大写工作,不能和亲戚一起工作)

Python import acting strange (only uppercase working, not with relatives)

我正在使用 PyCharm 和 Python 3,我有下一个 python 文件夹布局:

src/
    __init__.py
    command/
        __init__.py
        simpleremote/
            __init__.py
            Command.py
            GarageDoor.py
            GarageDoorOpenCommand.py
            Light.py
            LightOffCommand.py
            LightOnCommand.py
            RemoteControlTest.py
            SimpleRemoteControl.py

如您所见,我创建了程序包。具有 main 方法的文件是 RemoteControlTest.py,它与这些导入完美配合:

from pythonDesignPatterns.src.command.simpleremote.GarageDoor import GarageDoor
from pythonDesignPatterns.src.command.simpleremote.GarageDoorOpenCommand import GarageDoorOpenCommand
from pythonDesignPatterns.src.command.simpleremote.Light import Light
from pythonDesignPatterns.src.command.simpleremote.command import LightOnCommand
from pythonDesignPatterns.src.command.simpleremote.SimpleRemoteControl import SimpleRemoteControl

之前为包创建 init.py 文件,我尝试使用相对导入而不是以前的导入,例如

from .command import LightOnCommand

但它给了我一个错误(将调用此 案例 A):

SystemError: Parent module '' not loaded, cannot perform relative import. 

所以摆弄我发现这适用于同一行:

from command.simpleremote.Command import LightOnCommand

并且程序再次成功执行,但是如果我使用 IDE (PyCharm) 中的 "Refactor" 选项并将 "Command" 重命名为 "command" ,写下这一行:

from command.simpleremote.command import LightOnCommand

突然显示错误(案例B):

ImportError: No module named 'command.simpleremote'; 'command' is not a package

每种情况(A 和 B)的问题是什么?我不明白为什么从 command.simpleremote 导入时它会在每种情况之间起作用。为什么不更进一步或更接近一个级别?为什么它使用资本 'C' 而不是 'c'?这是否区分大小写?

我查看了官方 Python 文档(以及 PEP302、PEP328 和 PEP420 的网站),但它对我来说太复杂了,一晚上就搞定了。谁能以更简单的方式理解这一点(或者告诉我一个我可以阅读的关于这个解释更简单的资源)?

提前致谢

我估计你直接运行RemoteControlTest.py

案例A

如果模块 运行 直接作为脚本而不是通过包结构获取它,

Python 的导入程序无法转到父级。

Python 设计者大概不想让子模块直接作为脚本调用,所以没有真正好的解决方案。主要是你可以

  1. 运行 当 src 是当前目录或在 PYTHONPATH
  2. 时带有 python -m command.simpleremote.RemoteControlTest 的脚本
  3. 使用一个可以为您完成调用的测试框架。

可在 Relative imports in Python 3.

找到有关可能解决方案的更详细讨论

案例B

直接启动的结果是“src/command/simpleremote”在module search path中。 “src”似乎也被添加到路径中,但在“src/command/simpleremote”之后。

from command... 的情况 B 之前,导入机制在“src/command/simpleremote”中找不到匹配的“command”,并继续在“src”中查找command 找到包 -> 成功。

如果 B 它在“src/command/simpleremote”中找到 command.py,这不是包 -> 错误。