2017-01-04 44 views
0

我有以下文件夹结构和文件内容的项目:链进口在Python 2工作,但不能在Python 3

├── code 
│   ├── my_lib 
│   │   ├── __init__.py 
│   │   ├── moduleA.py 
│   │   └── moduleB.py 
│   ├── scriptA.py 
│   └── scriptB.py 

__init__.py

#empty 

moduleA.py

def funA(): 
    print("A") 

moduleB.py

import moduleA 

moduleA.funA() 

def funB(): 
    print("B") 

scriptA.py

from my_lib import moduleA 

moduleA.funA() 

scriptB.py

from my_lib import moduleB 

moduleB.funB() 

在Python 2.7,我可以成功地运行所有四个Python文件。但与Python 3.5,我不能运行scriptB.py,因为它给了我以下错误:

Traceback (most recent call last): 
    File "scriptB.py", line 1, in <module> 
    from my_lib import moduleB 
    File "/home/marjan/Desktop/code/my_lib/moduleB.py", line 1, in <module> 
    import moduleA 
ImportError: No module named 'moduleA' 

如果我运行moduleB.py(一说显然是导致问题)自身与Python 3,它在运行时问题。

Python 2与Python 3中链式导入的不同行为背后有什么原理,以及如何通过代码或项目结构中的最小更改来克服差异?

回答

2

您使用

from __future__ import absolute_import 

,然后你只需要使用两个Python的3路:你moduleB可以使用

from mylib import moduleA 

from . import moduleA # Relative to directory of this module 

但进口从不隐相对而言。

1

您需要在moduleB.py中使用from . import moduleA,使用python3来进行相对导入。否则,它被认为是绝对的进口。

+0

我已经得到'父模块''没有加载,不能执行相对导入'加入点并再次运行scriptB.py。我究竟做错了什么? –

+0

对不起,您需要使用'from。在'moduleB.py'中导入moduleA'。 –

+0

是的,它不工作。你能否纠正你的答案,我可以接受它,而不会感到困惑? –

相关问题