带有entry_point console_script的Python软件包分发

问题描述 投票:1回答:2

我正在准备部署具有以下布局的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

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时,我收到了ModuleNotFoundtasks错误。

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

提前感谢!

python python-3.x setuptools python-packaging
2个回答
1
投票
按照以下示例更改您的导入:

__ main __。py:

import tasks.something as something # to: import MyPackage.tasks.something as something # or from .tasks import something as something

0
投票
这里有两个问题。

    __main__.py中的导入语句是隐式相对的。将它们更改为绝对导入。
  1. console_scripts入口点目标需要解析为
  2. 不接受任何参数的可调用对象。在您的情况下,这意味着模块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中的导入语句更改为正确的相对导入:

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

© www.soinside.com 2019 - 2024. All rights reserved.