【问题标题】:Python package distribution with entry_point console_script带有 entry_point 控制台脚本的 Python 包分发
【发布时间】:2020-09-14 22:08:56
【问题描述】:

我正准备部署一个具有以下布局的 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 错误。

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

提前致谢!

【问题讨论】:

  • 可能是错误的导入;请将__main__.py 的内容添加到问题中。
  • 您调用的命令到底是什么,生成的完整错误消息是什么?您用于打包和安装项目的命令是什么?您提到了一个控制台脚本入口点 do_something = MyPackage.__main__:main,但在MyPackage/__main__.py 文件中似乎没有任何main 可调用(函数)。

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


【解决方案1】:

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

__main__.py

import tasks.something as something

# to:

import MyPackage.tasks.something as something

# or

from .tasks import something as something

【讨论】:

    【解决方案2】:

    这里有两个问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-18
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多