2012-02-16 61 views
2

我刚刚开始使用python,并且对理解包内模块加载的搜索路径有困难。我有这样的结构:Intrapack模块在python中的加载

top/      Top-level package 
    __init__.py    Initialize the top package 
    src/     Subpackage for source files 
     __init__.py 
     pkg1/   Source subpackage 1 
     __init__.py   
     mod1_1.py 
     mod1_2.py 
     ... 
     pkg2/   Source subpackage 2 
     __init__.py 
     mod2_1.py 
     mod2_2.py   
     ... 
     ... 
    test/     Subpackage for unit testing 
     __init__.py 
     pkg1Test/  Tests for subpackage1 
     __init__.py 
     testSuite1_1.py 
     testSuite1_2.py 
     ... 
     pkg2Test/  Tests for subpackage2 
     __init__.py 
     testSuite2_1.py 
     testSuite2_2.py 
     ... 
    ... 

在testSuite1_1我需要导入模块mod1_1.py(依此类推)。我应该使用哪些进口声明? Python的官方教程(位于docs.python.org,sec 6.4.2)说:

“如果在当前包(当前模块是子模块的包)中找不到导入的模块,则导入语句查找具有给定名称的顶级模块。“

我把这个意思,我可以使用(从内testSuite1_1.py):

从src.pkg1进口mod1_1

进口src.pkg1.mod1_1

既不可行。我在这里阅读了几个类似问题的答案,但找不到解决方案。

编辑:我改变了模块名称,遵循Python的命名约定。但是我仍然无法得到这个简单的例子。

+0

这给我一个破折号的语法错误。 – 2012-02-16 03:03:59

回答

0

问题与http://legacy.python.org/doc/essays/packages.html帮助解决(在类似的问题的统称)。关键之处在于:

“为了让Python程序使用包,必须通过import语句找到包,换句话说,包必须是包在sys.path上保存一个包的最简单方法是将它安装在标准库中或让用户通过设置$ sys PYTHONPATH shell环境变量“

将路径添加到”top“到PYTHONPATH解决了这个问题。为了使解决方案具有可移植性(这是一个个人项目,但我需要在多台机器上共享它),我想有一个最小化top/setup.py中的初始化代码应该可以工作。

+0

现在链接已损坏 – Michael 2017-01-24 17:21:44

+0

修复了指向旧版网站的链接 – stefano 2017-01-24 22:51:10

2

模块名称不包含.py扩展名。另外,在你的例子中,顶级模块实际上被命名为top。最后,连字符对python中的名字不合法,我建议用下划线替换它们。然后尝试:

from top.src.pkg1 import mod1_1 
+0

我更改了名称以遵循约定,但我仍然遇到与您的建议语法相同的错误 – stefano 2012-02-16 14:29:26

+0

PYTHONPATH中的“top”文件夹? – tzaman 2012-02-17 00:21:22