2

我正忙着用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_panel.py我可以成功

from pr.core.predictor import Predictor

但由于某种原因我不能

from pr.gui.pr_app import PrApp

我收到了

ImportError: cannot import name PrApp

从python中的父目录导入时是否有某种陷阱,或者我错过了什么?

4

3 回答 3

2

我尝试了这个并制作了一棵像你一样的树,但__init__.pypr目录中添加了一个。没有那个__init__.pyfrom pr.core.predictor import Predictor应该失败,所以我认为你有它,但忘了在你的问题中写下来。

我无法得到你所做的失败,它对我来说很好。predict_panel.py正如我预期的那样,我可以从 进行两个导入。

但是,如果我 from pr_app.pyimport predict_panel,那么 import from predict_panel.pyofPrApp将失败。这是因为我有一个循环导入。您尝试在导入期间导入predict_panelfrom并尝试在导入期间导入. 这会导致导入的无限递归,因此是不允许的。PrAppPrAppPrApppredict_panel

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

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

于 2012-12-11T09:45:08.463 回答
0

我使用 main.py 启动应用程序

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

我认为您的问题是您没有制作pr真正的包裹。尝试在__init__.py那里添加一个,它应该可以工作。

于 2012-12-11T09:37:14.647 回答
-1

无法从父目录导入的原因是每个脚本都将自己视为其导入树的顶部。它看到的唯一其他东西是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()))+"/.."))
于 2012-12-11T09:23:11.203 回答