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 设计者大概不想让子模块直接作为脚本调用,所以没有真正好的解决方案。主要是你可以
- 运行 当
src
是当前目录或在 PYTHONPATH
或 时带有 python -m command.simpleremote.RemoteControlTest
的脚本
- 使用一个可以为您完成调用的测试框架。
可在 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
,这不是包 -> 错误。
我正在使用 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 设计者大概不想让子模块直接作为脚本调用,所以没有真正好的解决方案。主要是你可以
- 运行 当
src
是当前目录或在PYTHONPATH
或 时带有 - 使用一个可以为您完成调用的测试框架。
python -m command.simpleremote.RemoteControlTest
的脚本
可在 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
,这不是包 -> 错误。