![](/img/trans.png)
[英]How can I make a python file runnable as a script and importable as a package?
[英]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.