簡體   English   中英

使 python3 包既可導入又可運行

[英]Making a python3 package both importable and runnable

我正在將一些舊腳本從 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)

功能文件

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'

我了解包內導入需要該句點,但是有什么方法可以在主腳本中進行此操作嗎? 或者另一種允許導入和運行的包結構?

將您的項目結構更改為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM