如何从父目录进行相对导入?

2024-09-25 00:24:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我搜索了这个,找到了很多答案,这些答案都告诉我要做我正在做的事情,下面是我的目录结构:

app/
+-- __init__.py
+-- app_manager.py
+-- app_gui/
|   +-- __init__.py
|   +-- app_gui.py

应用程序内_图形用户界面.py我有:

^{pr2}$

应用内管理器:

class AppManager():
    def __init__(self):
    """ default constructor for app manager """

在可视化代码中,它实际上将其解析为自动完成,这告诉我至少可视化代码认为它是正确的。但是,如果运行此程序,则会出现以下错误:

ModuleNotFoundError: No Module named "app_manager"

编辑

更改为from app.app_manager import AppManager时的完整堆栈跟踪:

Traceback (most recent call last):
   File ".\app_gui\app_gui.py", line 4, in <module>
     from app_manager import AppManager
ModuleNotFoundError: No module named 'app_manager' 

Tags: no答案代码frompyimportappinit
2条回答

像这样运行python代码充其量就是一种黑客行为。在

使用setup.py
这将需要一些小的改变,但将立即产生效益。
然后,您将能够像其他已安装的软件包一样使用您的app软件包。在

新建目录结构

.
├── app
│   ├── app_gui
│   │   ├── app_gui.py
│   │   └── __init__.py
│   ├── app_manager.py
│   └── __init__.py
└── setup.py

在设置.py在

^{pr2}$

应用程序_图形用户界面.py在

from app.app_manager import AppManager

manager = AppManager()

把它们放在一起

从与setup.py相同的目录运行:
$> python setup.py develop

这将把包符号链接到你的站点包文件夹中,在那里你可以像对待任何其他包一样对待它。i、 e.使用import app从系统上任何位置的脚本导入它。在

由于app_manager.pyapp_gui.py之上的目录,我相信您的导入(如果您希望使用相对导入)应该是

from ..app_manager import AppManager

编辑以解决注释中的错误:如果您尝试直接运行此文件,您将在注释中得到一个ValueError。相对导入在包内的模块之间工作。假设您使用我在上面写的导入,然后在app目录上有一个名为stuff.py的文件,其内容如下:

^{pr2}$

运行stuff.py将如下所示:

$ python stuff.py 
hello

换言之,直接用python解释器执行带有相对导入的文件将导致错误,因为它不打算以这种方式使用。相反,您的模型应该由模块本身之外的东西导入和执行。在

如果在app目录中有一个__main__文件,并且代码完全相同,那么也可以直接执行该模块。在

$ cat app/__main__.py 
import app.app_gui.app_gui
print('hello')

$ python -m app
hello

相关问题 更多 >