Python 从父目录导入失败,导入错误

Python 从父目录导入失败,导入错误,python,Python,我正忙于用python开发一个应用程序,我的应用程序的结构如下 main.py pr/ core/ __init__.py predictor.py gui/ predictor/ __init__.py predict_panel.py __init__.py pr_app.py __init__.py 我使用main.py 内部pr_app

我正忙于用python开发一个应用程序,我的应用程序的结构如下

main.py
pr/
    core/
        __init__.py
        predictor.py
    gui/
        predictor/
            __init__.py
            predict_panel.py
        __init__.py
        pr_app.py
    __init__.py
我使用
main.py

内部
pr_app.py
我有

class PrApp(wx.App):
    PREDICTOR = Predictor()
predict\u panel.py内部,我可以成功完成

从pr.core.predictor导入预测器

但由于某种原因,我做不到

从pr.gui.pr_应用程序导入PrApp

我被介绍给

ImportError:无法导入名称PrApp


在python中,从父目录导入时是否存在某种问题,或者我是否遗漏了什么?

无法从父目录导入的原因是,每个脚本都将自己视为其导入树的顶部。它只查看
sys.path
。据我所知,从上面导入的唯一机会是将父目录添加到路径(绝对而非相对)

将此项放在文件的顶部:

import sys
import os
import inspect

#enable imports from dir above
sys.path.append(os.path.abspath(
    os.path.dirname(inspect.getfile(inspect.currentframe()))+"/.."))
我使用main.py启动应用程序

通过这样做,您可以正确地将
pr/
文件夹设置为一个包,因此该包中的交叉引用导入应该可以工作。因此,
pr.gui.pr_app import PrApp
from..pr_app import PrApp
都应该可以工作


我认为你的问题在于你没有把
pr
做成一个真正的包。尝试在那里添加一个
\uuuuu init\uuuuuuuuuuuuuupy
,它应该也能工作。

我尝试了这个方法,并创建了一个与您类似的树,但在
pr
目录中添加了一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuupy。如果没有这个
\uuuu init\uuuuuu.py
你从pr.core.predictor导入predictor的
应该会失败,所以我认为你有它,但是忘了在你的问题中写它

我没能得到你的失败,这对我来说很好。我可以从
predict_panel.py
进行导入,正如我预期的那样

但是,如果我从
pr_app.py
导入
predict_panel
,则从
PrApp的
predict_panel.py
导入将失败。这是因为我有一个循环导入。在导入
PrApp
期间,您尝试从
PrApp
导入
predict\u面板
,在导入
predict\u面板
期间,您尝试导入
PrApp
。这将创建导入的无限递归,因此这是不允许的

解决这个问题的最好方法是重新组织代码,这样就不必进行循环导入。如果
PrApp
导入
predict\u panel
,为什么
predict\u panel
需要
PrApp
?这是一个有缺陷的设计的标志


但是,修复它的最快方法是将其中一个导入从模块顶部移动到调用它的函数/方法中。这是一种不好的做法,但它会很快解决您的问题。

为什么不干脆
os.path.abspath(os.path.dirname(\uuuu file\uuu)+“/”)
不使用
\uu file\uuuuu
会让您摆脱困境,因为这个变量并不总是存在的。在导入之前添加它,我可以看到父目录被添加到
sys.path
,虽然pr.gui.pr_app import PrApp中的
仍然会产生相同的错误如果这是问题所在,那么他的第一次导入也不会工作。即使pr不是一个合适的模块并且在sys.path上是问题所在,解决它也是一个相当丑陋的黑客。最好让它成为一个合适的模块。这始终是这里的问题。:-)那么pr.core.predictor导入predictor的
也不应该起作用,所以我认为有一个
\uuuuu init\uuuuuuuuuuuy
但是他忘了打印它。呜呜:(但是,好吧,那么它应该可以工作,修改导入路径应该是没有必要的。
\uu init\uuuuuuuuuupy
是空的吗?我已经稍微更改了布局以防止循环导入,它正在工作,我需要导入PrApp的原因是访问我在其中定义的常量。我已经将常量移动到一个新文件
settings.py 生活又好起来了。谢谢。我认为额外的信息很有用。@erikb85