python - 将文件从父目录导入 __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
以将项目打包成一个包,但我真的不明白这如何解决任何问题?
还有其他我错过或不理解的解决方案吗?
解决方案
您的库代码应该存在于一个包中。要使您的文件夹成为一个包,它需要具有__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
.
推荐阅读
- c++ - 使用不可默认构造的映射值添加到 std::map
- java - Java javax.xml.xpath.XPath 评估不返回节点
- python - Python:在手动计算回归系数时增加小数位
- django - 本地版本时 Heroku 找不到我的 Django 应用程序模块
- vb.net - 即使在关闭程序 vb.net 后,如何保留数据集数据的副本以使用它
- django-forms - 不使用内置 Django 表单的 Django 用户注册
- pandas - 替换 Python 字符串中的不完整匹配项
- python - 为什么 for 循环可以使用 all() 中的空集?
- reactjs - 无法在 JSX 中使用 reduce() - 未检测到函数
- python - 为fastapi设置图标?