【问题标题】:Importing files from different folder using __init__.py doesn't work in runtime使用 __init__.py 从不同文件夹导入文件在运行时不起作用
【发布时间】:2020-10-22 07:26:01
【问题描述】:

这是我第一次尝试从不同的文件夹导入。结构如下:

application
  │
  ├── __init__.py
  │
  ├── folder
  │     ├── file.py
        │
        └── __init__.py
  │ 
  └── folder2
      ├── some_file.py  
      │
      └── __init__.py

我想将 some_file 导入到 file.py 我试图做from application.folder2 import some_file,但它不起作用: ModuleNotFoundError: 没有名为“应用程序”的模块。

注意:可视代码将文件夹识别为模块,因此我只在运行时收到错误。

我关注了这个答案link,这是最适合我的。

这里有什么问题?

【问题讨论】:

  • 你如何运行这个应用程序?你是用python3 -m application.folder.file 还是python3 application/folder/file.py 运行它,还是你的入口点甚至在其他地方?
  • 我像python3 application/folder/file.py一样运行它

标签: python python-import importerror


【解决方案1】:

TLDR:将您的程序作为其包的一部分运行:

$ python3 -m application.folder.file

search path for modules 源自主脚本等。跑步

$ python3 application/folder/file.py

表示搜索路径在application/folder 内部——没有application 模块。

由于应用程序似乎打算作为一个包,请使用-m 开关将您的文件作为包结构的一部分运行:

$ python3 -m application.folder.file

这将查找application 包(包括当前目录)并递归遍历到.folder.file。这保证了导入路径与包布局匹配。

要从包含application 的文件夹以外的其他文件夹中使用它,请安装软件包或将set PYTHONPATH 指向application 的父文件夹。

$ export PYTHONPATH=$(PYTHONPATH):/path/to/parent_of_application
$ python3 -m application.folder.file

【讨论】:

  • 似乎有效。但这很烦人。这样,我不能直接从可视代码或调试中运行(与此有关吗?)。它只能使用终端命令工作,并且只能来自应用程序的主目录(例如,不在应用程序目录内)。顺便说一句,你说使用-m,但没有写命令,它通过使用:$ python3 -m application.folder.file
  • 我无法帮助您使用 Visual Code,但我确信它也支持这一点(我的 IDE 默认为这种模式)。请注意,像这样调用 python 并不局限于终端。至于在不包含目录的情况下执行此操作,我已经扩展了答案来描述它。
  • @Mr.O 感谢您发现错字(缺少-m),已修复。
  • 我会看看我的 IDE 选项。谢谢
猜你喜欢
  • 1970-01-01
  • 2019-06-26
  • 2016-03-27
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多