Python 3.4和Python 2.7中导入模块的区别

时间:2015-09-18 17:45:02

标签: python python-2.7 python-3.4

我正在尝试导入另一个文件夹中存在的包,它在python 3.4中运行得非常好。例如:文件存在于库文件夹

user> python
Python 3.4.1 (default, Nov 12 2014, 13:34:29)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from libraries.controller_utils import *
>>>      

然而,当我打开一个新的shell并使用Python 2.7时:

user> python
Python 2.7.4 (default, Jun  1 2015, 10:35:58)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-55)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from libraries.controller_utils import *
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named libraries.controller_utils
>>>

我尝试将条目添加到sys.path,但它没有帮助。我读了一个类似的问题here但解决方案并没有帮助我,因为我尝试了相对和绝对导入。请指教。

编辑:目录结构为~/tests/libraries/controller_utils.py。我在tests目录中执行这些命令。

编辑:我已经添加了sys.path条目,但仍然无法识别它。请注意,错误发生在2.7上,但在3.4

上工作正常
user> cd ~/tests/
user> ls
__pycache__  backups  inputs  libraries  openflow.py  test_flow.py
user> ls libraries/
__pycache__  controller_utils.py  general_utils.py  general_utils.pyc  tc_name_list.py  test_case_utils.py
user> python
Python 2.7.4 (default, Jun  1 2015, 10:35:58)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-55)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from libraries.controller_utils import *
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named libraries.controller_utils
>>> import sys
>>> sys.path.append('libraries/')
>>> from libraries.controller_utils import *
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named libraries.controller_utils

2 个答案:

答案 0 :(得分:5)

您的libraries个软件包缺少__init__.py个文件。您可以使用该名称创建一个空文件,然后:

from libraries.controller_utils import *

应该有用。

或者,如果您不想将libraries转换为套餐,则应将其路径添加到sys.path并导入controller_utils

import sys

sys.path.append('libraries/')
from controller_utils import *

请注意,错误是由于python2要求从包中导入__init__.py而python3.3 +提供namespace packages(参见PEP420)。这就是为什么导入在python3.4中没有失败的原因。

如果您希望代码在python2和python3中同样工作,则应始终将__init__.py文件添加到包在文件中使用from __future__ import absolute_import。< / p>

答案 1 :(得分:1)

PEP 0404

  

在Python 3中,包中的隐式相对导入不再可用 - 仅支持绝对导入和显式相对导入。此外,星级导入(例如来自x import *)仅允许在模块级代码中使用。

如果libraries位于同一目录中,则可能会避免与系统级别安装的软件包发生冲突。这本来是隐含的相对重要。

您应该可以使用.. 导航到模块的正确位置,例如:

from ..libraries.controller_utils import *
# or, depending of you directory structure
# put as many dots as directories you need to get out of
from ....common.libraries.controller_utils import *

但您的案例似乎与明星导入有关。在Python 3中,您只能在文件的顶层使用星型导入(from x import *),即不在函数或类定义中。