为什么不允许在同一目录中简单导入模块

时间:2016-05-28 16:53:09

标签: python

我在同一目录中创建了两个模块:

.
├── mod1.py
├── mod2.py

没有__init__.py,我不想将其创建为一个软件包,我只是创建一个简单的脚本,我通过分成不同的模块来模块化。

我的目的是使用mod1.py

运行python mod1.py
~/junk/imports$ cat mod1.py 
from . import mod2

print(mod2.some_expr)


$ cat mod2.py
some_expr = 'hello world!'

虽然我知道直接使用import mod1会有效,但我故意不使用它,这样我的模块名称就不会与内置模块冲突(我认为这是一个很好的做法)

我在python2python3

时遇到以下错误
~/junk/imports$ python3 --version
Python 3.4.3
kartik@kartik-lappy:~/junk/imports$ python3 mod1.py 
Traceback (most recent call last):
  File "mod1.py", line 1, in <module>
    from . import mod2
SystemError: Parent module '' not loaded, cannot perform relative import


~/junk/imports$ python2 --version
Python 2.7.11
~/junk/imports$ python2 mod1.py 
Traceback (most recent call last):
  File "mod1.py", line 1, in <module>
    from . import mod2
ValueError: Attempted relative import in non-package

StackOverflow上的大多数问题都是处理包,但我没有使用包。我只是想把它作为一个简单的脚本运行。

我的问题不是关于如何做到这一点,但我想知道上述背后不起作用的原因。

1 个答案:

答案 0 :(得分:1)

你不应该使用亲戚,但绝对导入:

import mod2
print(mod2.some_expr)

documentation非常好,SO answers使用importlib提供替代方案。

如果手工模块与内置模块冲突,正确的方法可能是重命名,最终通过添加{pre,suf}修复。 另一种方法是使用importlib

这些限制背后的动机可以在PEP 328中找到,主要来自BDFL偏好,而不是所有其他解决方案。