【问题标题】:Does python's setuptools support the `__name__ == "__main__"` style of execution?python 的 setuptools 是否支持 `__name__ == "__main__"` 的执行方式?
【发布时间】:2011-04-10 22:59:41
【问题描述】:

我刚刚开始使用 setuptools 进行打包,似乎推荐的安装 python 脚本和模块的方法是指定一个调用函数名称的脚本名称,如下所示:

setup(
    # ...
    entry_points = {
        "console_scripts": [
            "script_name": "project.main:main",
        ],
    }
)

这显然排除了使 python 模块可执行的标准方法,即(上次我检查,这是不久前)使用if __name__ == "__main__": do_stuff()。 setuptools 是否支持这种风格,还是我应该切换到定义一个 main 函数并在 entry_points 中指定它?

【问题讨论】:

    标签: python setuptools


    【解决方案1】:

    它是:"script_name = project.main:do_stuff 和 setuptools

    Setuptools 创建名为script_name 的脚本,该脚本导入并运行函数project.main:do_stuff,而不是直接运行脚本。您应该再次阅读 setuptools 文档的this part(alternate link,如果您使用 Distribute)以了解为什么会这样。它创建的脚本仍然包含if __name__ == "__main__"。所以是的,这仍然是让它执行的事实上的方式。

    这是使用 setuptools 安装的 easy_install 的副本

    #!/usr/bin/python
    # EASY-INSTALL-ENTRY-SCRIPT: 'distribute==0.6.14','console_scripts','easy_install'
    __requires__ = 'distribute==0.6.14'
    import sys
    from pkg_resources import load_entry_point
    
    if __name__ == '__main__':
        sys.exit(
            load_entry_point('distribute==0.6.14', 'console_scripts', 'easy_install')()
        )
    

    我认为最好定义一个入口点和一个类似于easy_install 的脚本。导入并使用入口点,就像您在示例 if __name__ == "__main__": do_stuff() 中显示的那样。它非常适合调试和早期测试,如果您使用distutils,则无需添加/更改任何内容。您还可以让另一个应用程序调用 do_stuff() 来访问您的应用程序,而无需在 shell 中运行它,这就是 setuptools 正在做的事情,distutils 复制的是脚本。

    【讨论】:

    • 在使用日志记录时,您如何处理本地部署/开发与从 pypi 部署的 __name__ 的差异?我似乎无法使用首选的logging.getLogger(__name__),因为它在本地开发人员上产生“__main__”,在安装工具安装时产生“<project>.<module>”。
    猜你喜欢
    • 2021-10-20
    • 2011-06-14
    • 2010-10-16
    • 2023-03-30
    • 2011-07-10
    • 1970-01-01
    • 2011-01-25
    • 2015-04-04
    • 1970-01-01
    相关资源
    最近更新 更多