Python 如何从父目录进行相对导入?
我搜索了这个,找到了很多答案,所有这些都告诉我要做我正在做的事情,下面是我的目录结构:Python 如何从父目录进行相对导入?,python,relative-import,Python,Relative Import,我搜索了这个,找到了很多答案,所有这些都告诉我要做我正在做的事情,下面是我的目录结构: app/ +--_uuuinit_uuuuu.py +--app_manager.py +--应用程序界面/ |+--\uuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu |+--app_gui.py 在app_gui.py中,我有: import tkinter as tk from tkinter import ttk f
app/
+--_uuuinit_uuuuu.py
+--app_manager.py
+--应用程序界面/
|+--\uuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
|+--app_gui.py
在app_gui.py中,我有:
import tkinter as tk
from tkinter import ttk
from app_manager import AppManager
应用程序内管理器:
class AppManager():
def __init__(self):
""" default constructor for app manager """
在可视化代码中,它实际上将此解析为自动完成,这告诉我至少可视化代码认为它已正确完成。但是,如果运行此命令,会出现以下错误:
ModuleNotFoundError:没有名为“应用程序管理器”的模块
编辑
从app.app\u manager导入AppManager更改为时的完整堆栈跟踪:
回溯(最近一次呼叫最后一次):
文件“\app\u gui\app\u gui.py”,第4行,在
从应用程序管理器导入应用程序管理器
ModuleNotFoundError:没有名为“应用程序管理器”的模块
由于app\u manager.py
是app\u gui.py
上方的目录,我相信您的导入(如果您希望使用相对导入)应该是
from ..app_manager import AppManager
编辑以解决注释中的错误:如果您尝试直接运行此文件,您将在注释中得到类似的ValueError
。相对导入在包内部的模块之间工作。假设您使用我在上面编写的导入,然后在app
目录上有一个名为stuff.py
的文件,其中包含以下内容:
import app.app_gui.app_gui
print('hello')
运行stuff.py
看起来像:
$ python stuff.py
hello
换句话说,直接使用python解释器执行具有相对导入的文件将导致错误,因为它不打算以这种方式使用。相反,您的模型应该由模块本身之外的东西导入和执行
如果您的应用程序
目录中有一个\uuuuuu main\uuuuu
文件,并且代码完全相同,您也可以直接执行模块
$ cat app/__main__.py
import app.app_gui.app_gui
print('hello')
$ python -m app
hello
像这样运行python代码充其量只是一种黑客行为
使用
这需要一些小的改变,但会带来即时的好处。
然后,您将能够像其他安装的软件包一样使用应用程序
软件包
新目录结构
setup.py
app_gui.py
把它们放在一起
从与setup.py相同的目录运行:
$>python setup.py develope
这将把包符号链接到你的站点包文件夹中,你可以像对待其他包一样对待它。i、 e.使用import app
从系统中任意位置的脚本导入 “ValueError:尝试在顶级包之外进行相对导入”python app_gui.py(当主程序位于app_gui.py中时),python app_manager.py(当我尝试将其切换到app_manager.py时)回答编辑以解决此问题。如果您还有问题,请告诉我。是的,很抱歉,许多编辑,但现在应该对您有好处,而且可能是TMI lol。您的\uuuuuu main\uuuuuu
在哪里?@Mark我已尝试将其放在app\u gui和app\u manager中,两者都会给我相同的错误,子包无法导入任何内容(即使它们位于同一目录中)在你的搜索中,你读过吗?好的,谢谢你,那么在这个场景中,main应该放在哪里呢?@Aserian这取决于你打算如何使用这个包。通常我会有一个单独的main.py
,它导入包并在\uuuuu main\uuuu
中使用它。此函数可能执行类似于导入应用程序app.run()的操作。
.
├── app
│ ├── app_gui
│ │ ├── app_gui.py
│ │ └── __init__.py
│ ├── app_manager.py
│ └── __init__.py
└── setup.py
from setuptools import find_packages, setup
setup(name='app',
version='0.0.1-dev',
description='My app package',
install_requires=['tkinter'],
packages=find_packages(),
zip_safe=False)
from app.app_manager import AppManager
manager = AppManager()