对如何从模块中的其他目录/父目录导入感到困惑 (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 时,我有 运行 两点困惑。
实际导入 DataViewer 的最合适方法是什么。我目前正在求助于在 AnalysisWidget 中包含 sys.path.append(os.path.abspath("../../PVAnalysis"))
,因为相对导入给了我 SystemError: Parent module '' not loaded, cannot perform relative import
在 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
归根结底,我要做的两件事是:
能够简单地 运行 AnalysisWidget.py(我知道一般来说你不应该从一个模块中 运行 脚本,但是当它谈到创建一个 GUI,我发现自己一直在这样做)
能够将 AnalysisWidget 导入 MainWindow。
如果我也清理一下我为 LabAnalysisModules 做导入的方式,那会很好。
为了包导入在 Python 3 中正常工作,您的工作目录必须是 LabAnalysisModules
和 PVAnalysis
的父目录(或者所述目录必须出现在 sys.path
,但将其设为工作目录是最简单的方法)。此外,如果您的任何模块是可运行的,则必须使用如下语法调用它们:
python -m 'PVAnalysis.AnalysisWindows.AnalysisWidget'
更多信息请咨询PEP 328。
首先,我知道这里已经提出了很多与此相关的问题(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 时,我有 运行 两点困惑。
实际导入 DataViewer 的最合适方法是什么。我目前正在求助于在 AnalysisWidget 中包含
sys.path.append(os.path.abspath("../../PVAnalysis"))
,因为相对导入给了我SystemError: Parent module '' not loaded, cannot perform relative import
在 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
归根结底,我要做的两件事是:
能够简单地 运行 AnalysisWidget.py(我知道一般来说你不应该从一个模块中 运行 脚本,但是当它谈到创建一个 GUI,我发现自己一直在这样做)
能够将 AnalysisWidget 导入 MainWindow。
如果我也清理一下我为 LabAnalysisModules 做导入的方式,那会很好。
为了包导入在 Python 3 中正常工作,您的工作目录必须是 LabAnalysisModules
和 PVAnalysis
的父目录(或者所述目录必须出现在 sys.path
,但将其设为工作目录是最简单的方法)。此外,如果您的任何模块是可运行的,则必须使用如下语法调用它们:
python -m 'PVAnalysis.AnalysisWindows.AnalysisWidget'
更多信息请咨询PEP 328。