使用entry_point console_script分发Python软件包

时间:2020-05-27 18:32:29

标签: python python-3.x setuptools python-packaging

我正准备部署具有以下布局的Python包:

>>> 
  Column1 Column2
0   Hello    TEST
1     Est    Ting
2      Gg      ff

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,则该模块也会导入问题。但是,当我运行import MyPackage.tasks.something as something脚本console_scripts时,我收到do_something的{​​{1}}错误。

是什么导致我的控制台脚本无法找到子包?

谢谢!

2 个答案:

答案 0 :(得分:4)

按照以下示例更改导入:

__ main __。py

import tasks.something as something

# to:

import MyPackage.tasks.something as something

# or

from .tasks import something as something

答案 1 :(得分:2)

这里有两个问题。

    __main__.py中的
  1. Import语句是隐式相对的。将它们更改为绝对导入。
  2. console_scripts入口点目标需要解析为不接受任何参数的 callable 。就您而言,这意味着模块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()

类似地,您应该将db1db2something中的import语句更改为正确的相对导入:

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