【问题标题】:setup.py and adding file to /bin/setup.py 并将文件添加到 /bin/
【发布时间】:2022-01-11 10:19:44
【问题描述】:

我不知道如何让setup.py 向用户的/bin/usr/bin 或其他任何内容添加脚本。

例如,我想将myscript.py 添加到/usr/bin,以便用户可以从任何目录调用myscript.py

【问题讨论】:

标签: python


【解决方案1】:

Python 文档在 installing scripts 部分对其进行了解释。

脚本是包含 Python 源代码的文件,旨在从命令行启动。

setup(...,
      scripts=['scripts/xmlproc_parse', 'scripts/xmlproc_val']
)

here所说,除了脚本,还有entry_points机制,更跨平台。

使用entry_points,您可以将命令行工具名称与您选择的函数连接起来,而scripts 可以指向任何文件(例如,shell 脚本)。

【讨论】:

  • 这似乎将文件放入 Python bin 目录(在我的 Mac 上 /opt/local/Library/Frameworks/Python.framework/Versions/3.1/bin/),但我仍然无法运行它们。
  • aharon,根据您安装 3.1 的方式,您可能必须更改 PATH 才能使其 bin 目录中的脚本正常运行。请参阅this answer 上一个问题以获取有关操作的说明。
  • 这也适用于不是 Python 脚本的脚本。不幸的是,如果 bin 目录中也列出了任何内容,包括纯数据文件,它也会认为是可执行的。
【解决方案2】:

如果你愿意构建和安装整个 python 包,我会这样做:

  • 编辑 setup.py 中的 setup() 函数以包含一个名为 scripts 的参数,并将其参数设置为您希望从任何地方运行的文件的位置。例如

setup(name='myproject',author='',author_email='',scripts=['bin/myscript.py'])

  • 在包含 setup.py 的目录中,通过键入 mkdir bin 创建一个 bin 目录
  • 将 myscript.py 添加到这个新创建的 bin 目录(并确保它是可执行的!)
  • cd 再次进入包含 setup.py 的目录,并通过键入 python setup.py install 安装整个 python 包
  • 安装软件包后,您应该可以从系统上的任何位置运行 myscript.py!

【讨论】:

  • 如果我想省略 py 扩展怎么办?顺便说一句,在 bin 目录下添加源代码的做法有点值得怀疑
  • @DataGreed 如果你想省略 .py 扩展名...省略它:) 只要文件是可执行的,扩展名可以省略,你可以简单地从命令中运行 myscript线。原谅我的幼稚,但是为什么在bin目录中添加源代码有问题?
  • 这是一个非常非常奇怪的决定。 Bin 应该包含构建,而不是源。
【解决方案3】:

考虑使用console_scripts

from setuptools import setup
setup(name='some-name',
      ...
      entry_points = {
              'console_scripts': [
                  'command-name = package.module:main_func_name',                  
              ],              
          },
)

main_func_name 是主模块中的主要功能。 command-name 是一个名称,它将被保存在 /usr/local/bin/ 中(通常)

【讨论】:

  • 如果您正在运行pip3 install --editable .,它将安装到/home/{username}/.local/bin 的命令中。如果你运行sudo pip3 install --editable .,它会将命令安装到/usr/local/bin/
  • 在 Mac 上,它也会安装到框架目录(对我来说是 /Library/Frameworks/Python.framework/Versions/3.7/bin),但不在 /usr 下(我的 pippython 在哪里)
【解决方案4】:

有两种方法可以从 setuptools 和 PyPI 基础架构中获得一个工作命令行工具:

  1. The "scripts" Keyword Argument
    这允许命令行执行您想要的一切,它可以是 Python 脚本、shell 脚本或完全不同的东西。
  2. The "console_scripts" Entry Point
    这允许将 Python 函数(不是脚本!)直接注册为命令行可访问的工具。

【讨论】:

  • 唉,第一种方法会将可能具有“.py”扩展名的脚本放入 bin 目录中,并且(我认为)不会针对 virtualenvs 进行调整。丑陋的。最好使用 console_scripts。
  • @Chris Cogdon,.py 扩展名不是必需的,至少对于 *nix 系统来说不是(我确实在文件顶部有一个 shebang)。虚拟环境表现不佳是对的-您必须转到环境的 bin 目录才能找到可执行文件。但是你可以从那里运行它。
猜你喜欢
  • 2017-05-25
  • 2012-08-24
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多