【问题标题】:Python: migrate setup.py "scripts=" to entry_pointsPython:将 setup.py "scripts=" 迁移到 entry_points
【发布时间】:2015-08-11 16:25:18
【问题描述】:

我想使用别人的python实用程序foobartools,它的原生环境是linux。 Foobartools 是纯 python,所以没有理由不能在我所在的 Windows 上使用它。

在他们的setup.py 中,他们使用的是旧式scripts=['bin/foobar'],

运行pip install -e b:\code\foobar 会在%pythonhome%\Scripts 中创建一个名为foobar 的文件,但是即使脚本在PATH 中,Windows 也不知道它。要使用它,我需要制作一个@python %pythonhome%\scripts\foobar 批处理文件。这可行,但不是最佳的(例如,ctrl-c 处理很丑陋)。

我知道,如果我将更新的和推荐的 entry_points 语法添加到 setup.py,pip 将在 Windows 上自动创建 Scripts\foobar.exe(我可以放弃批处理文件)。在 Linux 上Scripts\foobar 保持不变,每个人都很高兴。

entry_points = {
    'console_scripts': ['foobar = foobartools:main'],
}

我不知道如何处理等式的右侧,foobartools:main。如何拨打电话bin/foobarfoobartools 模块没有一个单独的可调用函数或模块,如 bin 脚本对应,bin 脚本相对复杂。

我想对项目进行尽可能少的更改,以便 a) 提交的补丁更有可能被上游接受,并且 b) 如果上游仍然不感兴趣,我可以做更少的工作来跟上它.

[更新]现有的源码树结构:

foobartools/
    bin/foobar
    foobartools/
        __init__.py
        foo/
            __init__.py
            one.py
            two.py
        bar/
            ...
        baz/
            ...
    setup.py

【问题讨论】:

    标签: python setup.py


    【解决方案1】:

    我得到了一个正常工作的 Scripts\foobar.exe,但它改变的代码比我希望的要多。我希望只对 setup.py 进行一些调整,或者至少在上游模块中不会乱七八糟的东西。我不太了解它,无法确定我不会以某种方式妨碍我。

    (1) 移动bin/foobar --> foobartools/foobar_cli.py
    (2)在setup.py中,注释掉#scripts=...并添加:

    entry_points = {
        'console_scripts': ['foobar = foobartools.foobar_cli:main'],
    } 
    

    [稍后] 对相同核心理念的改进,意味着我将我的肥脚远离主要业务领域:

    (1) 移动 ./bin/foobar --> ./foobar_cli/foobar.py(注意扩展名以及文件夹更改)
    (2) 在同一文件夹中添加一个空的__init__.py
    (3)console_scripts': ['foobar = foobar_cli.foorbar:main'],

    【讨论】:

    • 我认为您想出了一个非常合理的解决方案。 entry_points 仅适用于封装在所包含模块之一的特定函数中的脚本。我实际上不确定为什么setuptools 会施加这样的限制:-/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 2022-11-13
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    相关资源
    最近更新 更多