我在同一目录中创建了两个模块:
.
├── 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
会有效,但我故意不使用它,这样我的模块名称就不会与内置模块冲突(我认为这是一个很好的做法)
我在python2
和python3
~/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上的大多数问题都是处理包,但我没有使用包。我只是想把它作为一个简单的脚本运行。
我的问题不是关于如何做到这一点,但我想知道上述背后不起作用的原因。
答案 0 :(得分:1)
你不应该使用亲戚,但绝对导入:
import mod2
print(mod2.some_expr)
documentation非常好,SO answers使用importlib
提供替代方案。
如果手工模块与内置模块冲突,正确的方法可能是重命名,最终通过添加{pre,suf}修复。
另一种方法是使用importlib
。
这些限制背后的动机可以在PEP 328中找到,主要来自BDFL偏好,而不是所有其他解决方案。