我正在从python v2.7过渡到v3.6的一些旧脚本,我要做的一件事情是提供一个可以(a)导入的包,以将内部工作原理暴露给其他脚本,但是也(b)可从命令行运行,以典型方式运行。
在python2中,这并不困难-我同时使用了__init__.py文件(用于导入)和__main__.py文件(用于运行)。但是在python3中,这似乎不起作用-例如,采用最小包装:
minimal/
__init.py__
__main.py__
func.py
func2.py
__ init __。py
from .func import f
from .func2 import add2
__ main __。py
from func import f
f(1)
func.py
from .func2 import add2
def f(x):
print(add2(x))
func2.py
def add2(x):
return x + 2
如果我打开python并输入import minimal
的话就可以了,但是如果从命令行输入python minimal/
则会收到错误消息:
ImportError: attempted relative import with no known parent package
这出现在func.py的第1行,在func2的import
处。如果我改为从该行中删除句号,而改为from func2 import add2
,则可以从命令行运行python minimal/
很好。但是,当我尝试打开python并运行import minimal
时,在同一行出现错误:
ModuleNotFoundError: No module named 'func2'
我了解到包内导入需要一定的时间,但是还有什么方法可以使它在主脚本中起作用吗?还是另一个允许导入和运行的包结构?
答案 0 :(得分:1)
将您的项目结构更改为:
minimal_cmd/
├── __main__.py
└── minimal
├── __init__.py
├── func.py
└── func2.py
并在__main__.py
中进行完全合格的导入:
if __name__ == '__main__':
from minimal.func import f
f(1)
从命令行调用:
$ python minimal_cmd
3
,并在minimal
是当前工作目录或软件包在PYTHONPATH上时导入:
>>> import minimal
>>> minimal.f(2)
4