对如何从模块中的其他目录/父目录导入感到困惑 (python 3)

Confused about how to import from other directories / parent directories within module (python 3)

首先,我知道这里已经提出了很多与此相关的问题(This and This 看起来最相似)。我已经通读了其中的一些内容,但发现自己仍然对实现此目标的适当方法感到困惑。

我有一个我正在做的项目,它的结构是这样的:

--LabAnalysisModules
  |-- __init__.py
  |-- EphysTools
      |-- __init__.py
      |-- synaptics.py
      |-- utilities.py
  |-- PrairieAnalysis
      |-- pv_import.py
      |-- pxml_parse.py

--PVAnalysis
  |-- __init__.py
  |-- MainWindow.py
  |-- DataViewer.py
  |-- AnalysisWindows
      |-- __init__.py
      |-- AnalysisWidget.py

AnalysisWidget继承自DataViewer中的DataViewerclass。在尝试导入 DataViewer 时,我有 运行 两点困惑。

  1. 实际导入 DataViewer 的最合适方法是什么。我目前正在求助于在 AnalysisWidget 中包含 sys.path.append(os.path.abspath("../../PVAnalysis")),因为相对导入给了我 SystemError: Parent module '' not loaded, cannot perform relative import

  2. 在 DataViewer 中,我有这个 try...except 块(在我的一些机器上,LabAnalysisModules 已永久添加到 python 路径,而在其他机器上则没有)

    try:
        import PrairieAnalysis.pv_import as pvi
        import EphysTools.utilities as util
    except ImportError:
        import os
        sys.path.append(os.path.abspath('../LabAnalysisModules'))
        import PrairieAnalysis.pv_import as pvi
        import EphysTools.utilities as util
    

运行 DataViewer 本身工作正常,但我 运行 进入另一个导入错误 import DataViewer from AnalysisWidget:

ImportError: No module named 'PrairieAnalysis'

print(sys.path)添加到上面的except块中,这是导入DataViewer时添加到sys.path中的内容:

E:\Users\Dan\SkyDrive\Documents\Python\PVAnalysis\LabAnalysisModules'

这显然是不正确的。

我可以通过在 AnalysisWidget 中包含 sys.path.append('../../LabAnalysisModules') 来修复这个导入错误,但这似乎是一个非常笨拙的修复

编辑 1

正如我在评论中所说,最终AnalysisWidget将由MainWindow导入。同样,真的不清楚相对导入是如何工作的。获取:

    from .. import DataViewer
ValueError: attempted relative import beyond top-level package

归根结底,我要做的两件事是:

  1. 能够简单地 运行 AnalysisWidget.py(我知道一般来说你不应该从一个模块中 运行 脚本,但是当它谈到创建一个 GUI,我发现自己一直在这样做)

  2. 能够将 AnalysisWidget 导入 MainWindow。

如果我也清理一下我为 LabAnalysisModules 做导入的方式,那会很好。

为了包导入在 Python 3 中正常工作,您的工作目录必须是 LabAnalysisModulesPVAnalysis 的父目录(或者所述目录必须出现在 sys.path,但将其设为工作目录是最简单的方法)。此外,如果您的任何模块是可运行的,则必须使用如下语法调用它们:

python -m 'PVAnalysis.AnalysisWindows.AnalysisWidget'

更多信息请咨询PEP 328