2016-10-06 16 views
2

这种结构仅仅是一个例子多个相对进口3.5

pkg\ 
    test\ 
    __init__.py 
    test.py 
    __init__.py 
    source.py 
    another_source.py 

another_source.py

class Bar(): 
    def __init__(self): 
    self.name = "bar" 

source.py

from another_source import Bar 
class Foo(): 
    def __init__(self): 
    self.name = "foo" 
    b = Bar() 

test.py

from ..source import Foo 

if __name__== "__main__": 
    f = Foo() 
    print(f.name) 

现在我想运行test.py. 因为它已被接受为answer我得走了我目前的包装上面并运行

python -m pkg.test.test 

但是,这并不工作,蟒蛇给了我一个回溯

Traceback (most recent call last): 
    File "-\Python35\lib\runpy.py", line 170, in _run_module_as_main 
    "__main__", mod_spec) 
    File "-\Python35\lib\runpy.py", line 85, in _run_code 
    exec(code, run_globals) 
    File "~\test\test.py", line 1, in <module> 
    from ..source import Foo 
    File "~\source.py", line 1, in <module> 
    from another_source import Bar 
ImportError: No module named 'another_source' 

如果我删除所有another_source - 它会工作,但这不是一个解决方案。

现在是否有一种理智的方式从上方的目录中导入类?

+1

'如果我没有记错,从pkg.source import Foo'。 –

回答

1

pkg.source正试图从pkg.another_source模块导入东西,就像它是顶层一样。该进口需要更正:

from .another_source import Bar 
# or 
from pkg.another_source import another_source 
+0

但后来我的主脚本导入(与source.py相同的目录)失败。 – Nozdrum

+0

@Nozdrum:那么当你运行这些程序时,你可能不会一致地知道程序包层次结构的起始位置。你需要从'pkg'目录上面运行'python -m pkg.whatever',或者你需要放置一些样板来修复'__package__'和'sys.path',这在这里不太好解释(但是阅读[PEP 366](https://www.python.org/dev/peps/pep-0366/)将是一个好的开始)。 – user2357112

+0

如果我运行我的main.py,就像运行我的test.py一样。但对于我为什么它有效,它确实没有任何意义。 -m开关说它在那里“将库模块作为脚本运行”,但我没有运行任何库模块。我正在运行一个“主”脚本,就像我的test.py不是一个库,而是一个测试用例。 – Nozdrum