Python导入包,包括和不包括它';s名称空间

Python导入包,包括和不包括它';s名称空间,python,import,package,Python,Import,Package,我有一个名为sound的包,其目录结构如下: sound/ |-- __init__.py |-- interpreter.py |-- blast.py 在我得到这个包之前,explorer.py将使用命令import blast导入blast.py。现在,对于这个包,我必须说导入sound.blast作为blast 虽然我不介意这一点,但我希望能够将sound包与该语句一起导入到它的目录之外,而且还可以直接运行explorer.py。但是如果我直接运行interpreter.py,我会得到

我有一个名为
sound
的包,其目录结构如下:

sound/
|-- __init__.py
|-- interpreter.py
|-- blast.py
在我得到这个包之前,
explorer.py
将使用命令
import blast
导入
blast.py
。现在,对于这个包,我必须说
导入sound.blast作为blast

虽然我不介意这一点,但我希望能够将
sound
包与该语句一起导入到它的目录之外,而且还可以直接运行
explorer.py
。但是如果我直接运行
interpreter.py
,我会得到一个导入错误,说明
声音不存在

我目前的解决方案是这样的:

try:
    import sound.blast
except ImportError:
    import blast

但这感觉很难看。有更好的解决方法吗?

另一个解决方法是

将“try import”语句替换为explorer.py文件中的以下行

import sys
sys.path.append("..")

import sound.blast
因此,父目录也将包含在路径中,那么在声音目录中导入sound.blast将不再是问题

希望它能有所帮助。

在我的程序中,
sys.path.append(“…”)
方法实际上对更复杂的名称空间不起作用。我解决这个问题的最好办法是:

if __package__ == 'sound':  
    import sound.blast  
else:  
    import blast

然后,更复杂的名称空间开始工作,例如
sound.blast.driver.specification

为什么您希望能够直接运行解释器.py?我想是为了灵活性。这没什么大不了的,因为我更喜欢包和名称空间,但我可以想象这样一个场景:有人试图使用我的软件包,但却不知道如何使用它,因为他们试图直接运行解释器.py。我认为这个用例不够重要,您不应该这样做。我还有一个解释器的命令行参数。我不想总是导入包。我希望用户能够使用命令行参数运行它。