首页 > 解决方案 > 将文件从父目录导入 __main__

问题描述

请原谅我再写一篇“相对导入”的帖子,但我已经阅读了所有关于它们的堆栈溢出帖子,但我仍然感到困惑。

我有一个看起来像这样的文件结构:


|---MyProject
|  |---constants.py
|  |---MyScripts
|  |    |---script.py

在里面script.py我有from .. import constants.py

当然,当我运行时python3 script.py,我得到了错误ImportError: attempted relative import with no known parent package

据我了解,这不起作用,因为当您直接运行 python 文件时,您不能使用相对导入。经过数小时的搜索,似乎最流行的解决方案是添加"../"然后sys.path执行import constants.py,但这感觉有点 hacky。我必须相信有比这更好的解决方案吗?导入常量必须是一项相当普遍的任务。

我还看到有些人建议添加__init__.py以将项目打包成一个包,但我真的不明白这如何解决任何问题?

还有其他我错过或不理解的解决方案吗?

标签: pythonpython-3.x

解决方案


您的库代码应该存在于一个包中。要使您的文件夹成为一个包,它需要具有__init__.py.

您的脚本可以位于开发的顶级目录中。以下是您将如何构建此布局:

|---MyProject
|  |---myproject
|  |   |---__init__.py
|  |   |---constants.py
|  |---script.py

如果您要将其生产化,您可以将脚本放入一个特殊的文件夹中,但是它们将依赖于您系统上安装的软件包。布局可能如下所示:

|---MyProject
|  |---myproject
|  |   |---__init__.py
|  |   |---constants.py
|  |---scripts
|  |   |---script.py

在这两种情况下,您的导入都是正常的绝对(非相对)导入,例如

from myproject.constants import ...

或者

from myproject import constants

您是正确的,尝试在独立脚本中进行相对导入或路径修改是 ​​hacky。如果您想使用更灵活的第二种布局,setup.py请在根文件夹中创建一个安装脚本,然后运行python setup.py develop​​.


推荐阅读