【问题标题】:How can I configure my python package to copy files to a subfolder of scripts post installation如何配置我的 python 包以在安装后将文件复制到脚本的子文件夹
【发布时间】:2021-10-27 09:41:36
【问题描述】:

我有一个 python 包,其中包含其他语言的各种脚本。 Setuptools 已经支持将这些脚本复制到环境的scripts 目录中,以便从命令行访问它们。为此,我可以在 setup 命令中简单地使用以下关键字:

setup(
    ...
    scripts=["bin/script1.bat", "bin/script2.bat"],
    ...
    )

安装包后,脚本文件将正确地结束在环境的scripts文件夹中。

我的问题: 有没有办法让这些文件最终放在scripts 目录的子文件夹中? scripts/odd_scripts/script1.batscripts/even_scripts/script2.bat 之类的东西。

【问题讨论】:

  • 问题在于,与顶级脚本目录不同,odd_scriptseven_scripts 之类的子目录(或包决定的任何子目录名称)通常不在 $PATH 上,因此脚本不会可以运行,除了绝对路径。
  • 是的,我知道这一点。在我的场景中,调用程序会知道绝对路径而不使用 $PATH。

标签: python installation setuptools python-wheel


【解决方案1】:

由于它们不是 Python 脚本,因此您不需要 scripts 的主要功能(即:重写 shebang 以指向与用于安装包的 Python 运行时相同的可执行文件)。

在这种情况下,您可以将它们打包为data_files,原始可执行位和shebangs将被保留:

from setuptools import setup

setup(
    ...
    data_files=[('bin/odd_scripts', ['bin/script1.bat']),
                ('bin/even_scripts', ['bin/script2.bat'])],
    ...
)

【讨论】:

  • 太棒了。正是我想要的。谢谢!
  • 对不起,我必须将其作为已接受的答案删除。我刚刚意识到,data_files 方法已被弃用,并且不适用于轮子。 (来自setuptools.readthedocs.io/en/latest/references/…的官方文档)
  • @Stephan 嗯,哎呀,我已经很久没有使用它了,也没有注意到它的弃用。我对您声称它不适用于轮子的说法感到困惑,但它仍然可以与 .whl 文件分发一起使用,即使使用最新版本的 pip/setuptools/wheel 也是如此。我在 test.pypi.org here 上放了一个示例轮子,它是使用此答案中显示的结构创建的,您可以使用 pip install -i https://test.pypi.org/simple/ scripts-for-stephan==0.1 安装它。
  • 查看here 的讨论,似乎 setuptools 文档具有误导性,并且它仍然将 data_files 值传递给轮子只要它们是相对路径(这样它们可以相对于sys.prefix 安装在例如virtualenv 中)。绝对路径不起作用,但你不需要它。
  • 太棒了。非常感谢你所有的额外工作@wim。我会重新接受答案作为解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
相关资源
最近更新 更多