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

时间:2015-01-29 14:50:50

标签: python python-import python-module pythonpath

首先,我知道有很多与此问题有关的问题(ThisThis似乎最相似)。我已经阅读了其中的一些内容,但我发现自己仍然对实现这一目标的适当方式感到困惑。

我正在开发一个以这种方式构建的项目:

--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中的DataViewer类。在尝试导入DataViewer时,我遇到了两点困惑。

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

  2. 在DataViewer中我有这个尝试...除了块(在我的一些机器上,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
    
  3. 运行DataViewer本身工作正常,但我遇到来自import DataViewer的另一个导入错误AnalysisWidget

    ImportError: No module named 'PrairieAnalysis'
    

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

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

    这显然不正确。

    我可以通过在sys.path.append('../../LabAnalysisModules')中添加AnalysisWidget来修复此导入错误,但这似乎是一个非常糟糕的修复

    修改1

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

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

    在一天结束时,我要做的两件事是:

    1. 能够简单地运行AnalysisWidget.py(我知道通常你不应该从模块中运行脚本,但是当涉及到创建GUI时,我发现自己一直这样做)

    2. 能够将AnalysisWidget导入MainWindow。

    3. 如果我清理我如何为LabAnalysisModules做进口,那将是好事。

1 个答案:

答案 0 :(得分:1)

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

python -m 'PVAnalysis.AnalysisWindows.AnalysisWidget'

有关详细信息,请参阅PEP 328