Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从父目录进行相对导入?_Python_Relative Import - Fatal编程技术网

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()