我还在学习使用Python编写更好的代码。因此,我试图在编程中使用一些结构。像name_conventions和结构化包装& amp;模块。
那说我遇到了一个我无法解决的问题。 我选择的结构如下:
在Core controller.py中,我试图导入Stats(对象)类。 我尝试了几种不同的方法。在我的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做同样的事情时。 它确实有效。所以我真的很困惑。我做错了吗?
还有特殊的设计模式来处理进口吗?
答案 0 :(得分:1)
您应该在插件目录中添加 __ init __。py 文件,使其看起来像
您可以阅读有关Python模块here的更多信息 - 请查看 6.4。封装强>
通过将其添加到pythonpath
,您还可以使您想要导入的模块对所有人都可见sys.path.append("/path/to/main_folder")
此模块在另一个名称空间之前
您会找到更多信息here
答案 1 :(得分:0)
先放From plugin import stats
,然后放from stats import controller
和import _init_
答案 2 :(得分:0)
如果从终端运行,它只会尝试从当前文件夹导入。您必须使用以下代码在文件的结构中手动将主文件夹的路径添加到此文件
import sys
sys.path.append("../")
如果你想支持2个文件夹,请添加../../而不是../
答案 3 :(得分:0)
您不应该直接将包的子模块作为脚本启动。这会在大多数时候弄乱您的层次结构。而是将其称为模块:
python -m Core.controller
答案 4 :(得分:0)
您可以将以下内容添加到任何脚本的顶部来验证以下内容:
import sys
for p in sys.path:
print(repr(p))
调用时导入的原因为:
python main.py
是python会将脚本的目录添加到pythonpath(在这种情况下是空字符串''
)
但是,在运行时
python Core/controller.py
它会将Core
添加到sys.path
,使您项目的其余部分无法使用
您可以改为使用
python -m Core.controller
将使用runpy
调用并再次将空字符串放在python路径上。
您可以在此处阅读有关python解释器调用选项的更多信息:https://docs.python.org/2/using/cmdline.html您可以在此处阅读有关runpy的信息:https://docs.python.org/2/library/runpy.html