首先让我说我已经对过去一周的课程进行了广泛的研究,但还没有找到这些问题的实际答案 - 只是一些模糊的答案并没有真正解释正在发生的事情。如果这只是因为我错过了我想要的东西,我很抱歉 - 请指出我正确的方向。
我的目录结构是:
TestProject/
runtest*
testpackage/
__init__.py
testmod.py
testmod2.py
testsubs/
testsubmod.py
一对夫妇注意到:
我观察过的事情:
问题:
提前致谢。
答案 0 :(得分:8)
首先,您会在section 6 of The Python Tutorial找到所需的所有信息。
(1)python是否与包装上的进口有不同的处理& pythonpath中存在的模块比尝试从当前目录导入模块时要好吗?
不,它没有。实际上,Python在导入模块时总是搜索sys.path
。仅找到当前目录中的模块,因为sys.path
包含带有空字符串的条目,表示当前目录。
(2)为什么
import testpackage
不允许我访问testpackage.testmod
?当我导入os
时,我可以访问os.path
(等)。
为提高效率,import testpackage
仅加载testpackage/__init__.py
。如果您需要testpackage.testmod
,则必须明确导入它:
import testpackage # Just imports testpackage, not testpackage.testmod!
import testpackage.testmod # Import *both* testpackage and testpackage.testmod!
如果您始终要导出testmod
,请在__init__.py
内导出,这是os
(os/__init__.py
)的作用。这样,如果您导入testpackage.testmod
,则testpackage
始终可以隐含使用。
由于Python是跨平台的,因此实际上无法在目录中一致地自动加载模块,因为某些文件系统不区分大小写(Windows!)。 Python不知道是否将os/path.py
加载为os.path
或os.Path
等。
(3)对于一个包,我应该坚持在基目录中使用单个
__init__.py
,还是应该将它们嵌套在后续目录中?
每个子包总是需要__init__.py
。有关于放弃这一要求的讨论,但决定保持原样。
(4)如何导入指定包名称的模块? I.E.来自
testmod.py
,我想导入testpackage.testmod2
而非testmod2
。
这应该有效。只需确保从顶级目录运行代码。如果当前目录为testpackage
,则testmod
不知道它在包中。
首选方法是使用相对的包内导入:
from . import testmod2
如果存在名为testmod2
的全局模块,则可以防止名称冲突,并且可以使用包中的已知模块的名称而不会出现问题。
(5)从subsubs目录导入子模块的正确方法是什么? 我看到的唯一解决方案是将该目录从
__init__.py
附加到pythonpath,但我不知道这是否正确。
不,不要那样做!当其中一个父目录已经在sys.path
时,永远不要将目录放到sys.path
!这可能导致你的模块被加载两次,这是一件坏事!
通常您应该能够使用绝对或相对导入从子包加载模块:
import testpackage.testsubs.testsubmod
from testpackage.testsubs import testsubmod
from .testsubs import testsubmod
确保在__init__.py
内创建testsubs/
!
答案 1 :(得分:0)
testpackage
目录。