使python3包既可导入又可运行

时间:2018-09-03 19:48:57

标签: python python-3.x

我正在从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'

我了解到包内导入需要一定的时间,但是还有什么方法可以使它在主脚本中起作用吗?还是另一个允许导入和运行的包结构?

1 个答案:

答案 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