[英]Python package distribution with entry_point console_script
我正准備部署一個 Python package 布局如下:
MyPackage/
setup.py
MyPackage/
__init__.py
__main__.py
lib/
__init__.py
utils.py
db/
__init__.py
db1.py
db2.py
tasks/
__init__.py
something.py
setup.py
包含:
setup(name = MyPackage,
...
packages = find_packages(),
include_package_data = True,
entry_points = {"console_scripts" : [
"do_something = MyPackage.__main__:main"
]})
__main__.py
包含:
import tasks.something as something
something.my_function()
something
模塊包含:
import db.db1 as db1
import db.db2 as db2
def my_function():
db1.this_func(...)
db2.that_func(...)
db1
包含:
import sqlalchemy
import lib.utils as utils
def this_func(...):
sqlalchemy.create_engine(...)
db2
包含:
import sqlalchemy
import lib.utils as utils
def that_func(...):
sqlalchemy.create_engine(...)
通過從安裝的site-packages
目錄執行運行時, __main__.py
完成沒有問題。 如果我在交互式 session 中執行import MyPackage.tasks.something as something
,則該模塊也會導入問題。 但是,當我運行console_scripts
腳本do_something
時,我收到了針對tasks
的ModuleNotFound
錯誤。
是什么導致我的控制台腳本無法找到子包?
提前致謝!
按照以下示例更改您的導入:
__main__.py :
import tasks.something as something
# to:
import MyPackage.tasks.something as something
# or
from .tasks import something as something
這里有兩個問題。
__main__.py
中的導入語句是隱式相對的。 將它們更改為絕對導入。console_scripts
入口點目標需要解析為不接受 arguments的可調用對象。 在您的情況下,這意味着模塊MyPackage/__main__.py
應該定義一個可調用的main
。 像這樣更改__main__.py
:
from MyPackage.tasks import something
def main():
# command line arguments parsing and logging configuration goes here ..
something.my_function()
if __name__ == "__main__":
main()
同樣,您something
將db1
、 db2
中的導入語句更改為正確的相對導入:
from ..db import db1
from ..db import db2
from ..lib import utils
或者,使用絕對導入:
from MyPackage.db import db1
from MyPackage.db import db2
from MyPackage.lib import utils
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.