如何从位于不同子目录中的python脚本导入

2024-05-23 17:49:49 发布

您现在位置:Python中文网/ 问答频道 /正文

对于一个大学项目,我有一堆python文件,它们都有单独的用例,没有中心代码入口点。因为我将代码排序到有意义的子目录中,所以从这些子目录中导入的内容被破坏了。从其中一个子目录调用脚本时,结果是:

  File "project/glm/predict_for_all.py", line 9, in <module>
    from util.misc import load_data
ModuleNotFoundError: No module named 'util'

如果我将导入更改为from project.util.misc import load_data,也会发生同样的情况:没有名为project的模块

使用from util.misc ...导入语句调用例如visualise_all.py是有效的

作为参考,这里有一个(稍微简化的)目录树

project/
├── project
|   ├── ann
|   │   ├── __init__.py
|   │   ├── predict_for_all.py
|   |   └── predict_for_one.py 
|   ├── glm
|   │   ├── __init__.py
|   │   ├── predict_for_all.py
|   |   └── predict_for_one.py 
|   ├── util
|   │   ├── __init__.py
|   │   ├── linear_modelling.py
|   │   ├── misc.py
|   │   └── plotting.py
|   ├── __init__.py
|   ├── visualise_one.py
|   └── visualise_all.py
└── test

到目前为止我已经尝试过的事情:

  • 向每个目录添加了__init__.py个文件
  • 将导入更改为包含project(之前:from util.misc import ..,现在:from project.util.misc import ..
  • 已尝试相对导入(from ..util.misc ...):错误更改为ImportError: attempted relative import with no known parent package

SO chat提出了以下建议:

  • 添加setup.py并以editable模式安装项目,以帮助解决导入冲突。诚然,我没有对此进行过很多研究,我主要是从一些搜索中假设我需要在代码中使用一个中心入口点来正确使用这种方法

我没有尝试过的事情:

  • 将所有项目(子)目录添加到PATH/PYTHONPATH。从其他答案来看,这似乎是一个解决办法。但是,对于每个项目,必须手动执行此操作听起来似乎会导致环境变量的大量混乱,并且难以跟踪工作开销(如果这实际上是常见做法,请纠正我)

我注意到的事情:

  • 当导入以项目名称开始时,我的IDE(vscode)可以自动完成路径。我正在使用带有选项autoSearchPaths: TrueextraPaths: ['abs_path/to/project/project']pylance,这表明我的python安装(在编辑器之外)无法查看项目的顶级文件夹之外的内容
  • project/终端中打开python控制台并键入import projectfrom project.util.misc import load_data之类的导入时,它们传递时没有任何NotFoundError。这意味着什么,我不能说

非常欢迎提出解决此问题或深入诊断此问题的建议!理想情况下,我也想知道如何在未来的工作中完全避免类似的问题


Tags: 项目代码frompyimportprojectfordata