【问题标题】:How do I use setuptools or distutils to distribute a script as opposed to a Python package?我如何使用 setuptools 或 distutils 分发脚本而不是 Python 包?
【发布时间】:2015-07-08 23:20:00
【问题描述】:

过去,我看到的大多数distutilssetuptools 的教程似乎都面向分发所谓的“Python 包”;即密切相关的 Python 模块的集合,它们最终旨在作为一个单元一起导入到其他东西中。

我有一点不同:一个大型命令行脚本。该脚本当前位于一个 Python 项目中,其结构类似于以下内容:

git_repo/
    .gitignore
    README.rst
    src/
        myscript.py
        sub_module1.py
        sub_module2.py
        sub_module3.py
    test/
        test_sub_module1.py
        test_sub_module2.py
        test_sub_module3.py

myscript.py 文件中,前几行如下所示:

#!/usr/bin/env python

import sub_module1
import sub_module2
import sub_module3

# Go do a bunch of stuff...
# etc...

各种子模块中包含的代码大部分是我无法想象的想要在另一个项目中重复使用的东西;这些部分都相当特定于主应用程序myscript.py。此外,每个submodule.py 文件内部的材料在一个子模块和另一个子模块之间也没有那么密切相关。总的来说,我认为将它们组合到一个带有自己的__init__.py 文件的子包中并不是特别自然或合乎逻辑的。事实上,我什至首先拥有这些子模块文件的唯一原因只是为了帮助更干净地组织主脚本;这样做会导致顶级 myscript.py 文件出现 100 行,而不是全部堆积成一个巨大的 1000 行滚动。

在我的git_repo/src 目录中,我可以通过在命令行中输入来执行此脚本,例如:

./myscript.py --opt1 <value_1> --opt2 <value_2> --opt3 <value_3> ...

我的问题:既然这个项目是一个命令行脚本而不是一个可导入的包,那么在这种情况下我应该如何调用setuptoolssetup()函数呢?如何选择setup() 的输入参数,以便让它知道它应该将myscript.py 视为可执行脚本(例如,它知道在安装期间执行chmod 755 myscript.py),同时也明确随附的submodule.py 文件虽然不是脚本本身,但仍然是必需的依赖项,应该在同一目录中与myscript.py 相邻安装?在这种情况下,setup 函数的正确形式是什么?

【问题讨论】:

    标签: python setuptools distutils


    【解决方案1】:

    您应该使用 setuptools 入口点,pip install pkg 将为您创建一个 bin/ 脚本。当您进行系统范围的软件包安装时,脚本将转到 /usr/bin/usr/local/bin

    About entry points

    【讨论】:

    • 我不确定我是否理解您的回答。听起来你在说:1.) 将我所有的代码放在一个名为 pkg 的子目录中,以及一个 __init__.py 文件,2.) 将 myscript.py 重写为该包中的一个函数,3.) 参考myscript() 函数作为调用setup() 的入口点,4.) setuptools 将在我的site_packages 区域安装包,并自动生成一个脚本以进入/usr/local/bin。这可能会解决问题,但是没有办法编写一个简单地与我现在已经拥有的项目结构一起工作的setup.py 文件吗?
    • 是的,基本上我说的是1、2、3、4。这是Python社区的最佳实践,也是推荐的做法。更多信息请参考packaging.python.org/en/latest/distributing.html
    • 好的,谢谢,我查看了链接中的信息,您似乎是正确的。
    猜你喜欢
    • 2010-11-28
    • 2010-10-04
    • 2013-07-22
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多