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

如何从位于不同子目录中的python脚本导入,python,python-3.x,Python,Python 3.x,对于一个大学项目,我有一堆python文件,它们都有单独的用例,没有中心代码入口点。因为我将代码排序到有意义的子目录中,所以从这些子目录中导入的内容被破坏了。从其中一个子目录调用脚本时,结果是: File "project/glm/predict_for_all.py", line 9, in <module> from util.misc import load_data ModuleNotFoundError: No module named 'u

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

  File "project/glm/predict_for_all.py", line 9, in <module>
    from util.misc import load_data
ModuleNotFoundError: No module named 'util'
到目前为止我已经尝试过的事情:

  • \uuuu init\uuuuu.py
    文件添加到每个目录
  • 将导入更改为包括
    project
    (之前:
    来自util.misc import..
    ,现在:
    来自project.util.misc import..
  • 尝试了相对导入(
    from..util.misc…
    ):错误更改为
    ImportError:尝试了没有已知父包的相对导入
SO chat提出了以下建议:


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

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

  • 当导入以项目名称开始时,我的IDE(vscode)可以自动完成路径。我使用的
    pylance
    选项有
    autosearchpath:True
    extrapath:['abs_path/to/project/project']
    ,这表明我的python安装(在编辑器之外)无法看到项目的顶级文件夹之外
  • 在终端的
    project/
    上打开
    python
    控制台,并从project.util.misc import load_data中键入导入内容,如导入项目和导入数据,这些内容将在没有任何NotFoundError的情况下通过。这意味着什么,我不能说

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

“我主要是从一些搜索中假设,我需要在代码中使用一个中心入口点来正确使用这种方法”您不需要。安装准备导入项目;项目的执行需要一个入口点。请注意,如果您需要,一个包可能有多个入口点。@Mistermiagi因此在以可编辑模式安装项目后,您可以像以前一样调用它(
python project/glm/prepare_for_all.py
),而不是
project--一些参数指示要执行的内容以及导入应该解决的问题?理想情况下,您可以将其称为
python-m project.glm.prepare_for_all
,甚至可以通过已安装的控制台脚本将其称为
prepare_for_all
,但是只要
python project/glm/prepare_for_all.py
也应该可以工作。@MisterMiyagi在安装包后,使用和不使用
-m
调用它对子目录中的脚本都有效,非常感谢。请详细说明“通过控制台脚本安装”的内容好吗?软件包允许定义。安装包之后会自动创建脚本,每个脚本调用其中一个入口点。
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