pyclbr无法从另一个目录导入类?

时间:2015-07-17 19:07:32

标签: python

如果A.py和B.py在同一目录中,这可以正常工作

# module.py
class A(object):
    pass

class B(A):
    pass

# module2.py
import module
class C(module.B):
    pass

工作正常:

Python 2.7.8 |Continuum Analytics, Inc.| (default, Jul  2 2014, 15:13:35) [MSC v.1500 32 bit (Intel)] on win32
>>> import pyclbr
>>> m = pyclbr.readmodule( "module2")
>>> m.items()[0][1].super
[<pyclbr.Class instance at 0x01EE61E8>]

但是如果我将module.py放在foo目录中,而不是:

# module2.py
import foo.module
class C(foo.module.B):
    pass

pyclbr无法解析foo.module.B:

Python 2.7.8 |Continuum Analytics, Inc.| (default, Jul  2 2014, 15:13:35) [MSC v.1500 32 bit (Intel)] on win32
>>> import pyclbr
>>> m = pyclbr.readmodule( "module2")
>>> m.items()[0][1].super
['foo.module.B']

1 个答案:

答案 0 :(得分:0)

这就是为什么你必须在放置python模块的目录中创建一个空的__init__.py文件。即:

.
├── main.py
├── foo
|   ├── __init__.py
|   └── module2.py

所以你这样导入:

# main.py    
import foo.module2

pyclbr.readmodule("foo.module2.B")

或将第二个参数传递给pyclbr.readmodule(module, path=None)

paths_lookup = ["foo", "other/path"] 
pyclbr.readmodule("module2", paths_lookup)

当将一个路径列表传递给pyclbr.readmodule时,Python会将这些路径与sys.path合并。
无论如何,只需记住为每个模块目录创建一个__init__.py