使用入口点console_script进行Python包分发

Ale*_*lex 4 python setuptools python-3.x python-packaging

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

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
Run Code Online (Sandbox Code Playgroud)

其中setup.py包含:

setup(name = MyPackage,
      ...
      packages = find_packages(),
      include_package_data = True,
      entry_points = {"console_scripts" : [
          "do_something = MyPackage.__main__:main"
      ]})
Run Code Online (Sandbox Code Playgroud)

__main__.py包含:

import tasks.something as something

something.my_function()
Run Code Online (Sandbox Code Playgroud)

something模块包含:

import db.db1 as db1
import db.db2 as db2

def my_function():
  db1.this_func(...)
  db2.that_func(...)
Run Code Online (Sandbox Code Playgroud)

db1包含:

import sqlalchemy
import lib.utils as utils

def this_func(...):
  sqlalchemy.create_engine(...)
Run Code Online (Sandbox Code Playgroud)

db2包含:

import sqlalchemy
import lib.utils as utils

def that_func(...):
  sqlalchemy.create_engine(...)
Run Code Online (Sandbox Code Playgroud)

通过从安装的site-packages目录执行来运行时,__main__.py可以顺利完成。如果我import MyPackage.tasks.something as something在交互式会话中执行,该模块导入也会出现问题。但是,当我运行console_scripts脚本时,我收到了错误。do_somethingModuleNotFoundtasks

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

提前致谢!

dom*_*nik 5

按照以下示例更改您的导入:

__main__.py

import tasks.something as something

# to:

import MyPackage.tasks.something as something

# or

from .tasks import something as something
Run Code Online (Sandbox Code Playgroud)