首先,我知道有很多与此问题有关的问题(This和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中的DataViewer类。在尝试导入DataViewer时,我遇到了两点困惑。
实际导入DataViewer的最合适方法是什么。我目前正在分析sys.path.append(os.path.abspath("../../PVAnalysis"))
在AnalysisWidget中,因为相对导入会给我SystemError: Parent module '' not loaded, cannot perform relative import
在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
运行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
在一天结束时,我要做的两件事是:
能够简单地运行AnalysisWidget.py(我知道通常你不应该从模块中运行脚本,但是当涉及到创建GUI时,我发现自己一直这样做)
能够将AnalysisWidget导入MainWindow。
如果我清理我如何为LabAnalysisModules做进口,那将是好事。
答案 0 :(得分:1)
为了使程序包导入在Python 3中正常工作,您的工作目录必须是LabAnalysisModules
和PVAnalysis
的父目录(或者该目录必须出现在sys.path
上,但是工作目录是最简单的方法)。此外,如果您的任何模块都是可运行的,则必须使用以下语法调用它们:
python -m 'PVAnalysis.AnalysisWindows.AnalysisWidget'
有关详细信息,请参阅PEP 328。