使python3包既可导入又可运行

2024-06-01 04:44:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将一些旧的脚本从pythonv2.7转换到v3.6,我想做的一件事是有一个包,它可以(a)被导入以将内部工作暴露给其他脚本,但是(b)可以从命令行运行,以典型的方式运行。你知道吗

在python2中,这并不难——我使用了一个uu init_uuuuuuuuuuuuuy.py文件(用于导入)和一个uuuu main_uuuuuuuuuuuuuy.py文件(用于运行)。但在python3中,这似乎不起作用——例如,以最小的包为例:

minimal/
  __init.py__
  __main.py__
  func.py
  func2.py

初始值

from .func import f
from .func2 import add2

主屏幕

from func import f
f(1)

职能部门

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

这出现在第1行职能部门,位于func2的import。如果我从该行中删除句点,使其成为from func2 import add2,那么我可以从命令行运行python minimal/。但是当我试图打开python并运行import minimal时,在同一行中我得到了错误:

ModuleNotFoundError: No module named 'func2'

我知道包内导入需要一段时间,但是有没有办法在主脚本中也可以这样做呢?或者另一个允许导入和运行的包结构?你知道吗


Tags: 文件命令行frompyimport脚本initmain
1条回答
网友
1楼 · 发布于 2024-06-01 04:44:12

将项目结构更改为:

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

相关问题 更多 >