有没有一种惯用的方法来使用 setuptools 安装 systemd 单元?

Iai*_*ane 9 python distutils pip setuptools

我正在分发一个可以导入并用作库的模块。它还附带了一个可执行文件\xe2\x80\x94,通过console_scripts\xe2\x80\x94安装,供人们使用。

\n\n

该可执行文件可以作为 systemd 服务 ( ) 启动Type=simple,以向系统提供守护进程。

\n\n

systemd 服务需要引用其行中的绝对路径ExecStart,因此我需要找出console_script安装到的位置。

\n\n

使用其他构建系统(如 CMake、autotools 或 Meson),我可以直接访问前缀,然后使用configure_file(meson) 之类的内容替换@PREFIX@in foo.service.in,然后将生成的单元安装到$prefix/lib/systemd/system/.

\n\n

我只是不知道如何使用安装工具来做到这一点。里面的setup.py,sys.prefix设置为python 的 prefix,这不是同一件事。我尝试过覆盖install_datainstall,但这些方法都有各种问题,例如通过 构建轮子时损坏pip,或者卸载时留下文件。(当我们没有在系统范围内安装服务时,我只要不安装该服务就可以了;如果前缀不存在或/usr无论如何, systemd 将无法找到它/usr/local。)

\n\n

有人向我指出一个网站,该网站说您不应该使用 setuptools 执行此操作

\n\n
\n

顺便说一下,请注意,这种数据文件封装意味着您实际上无法将数据文件安装到用户计算机上的某个任意位置;这是一个功能,而不是一个错误。

\n
\n\n

这听起来像是我在这里违背了原则。我真的在寻找指示或例子来告诉我我应该在这里做什么。如果那是“不使用安装工具”,那很好,但欢迎就首选的东西提出建议。

\n

sin*_*roc 6

我想说不要为此使用setuptools,这不是它的用途。而是使用目标发行版的包管理器(apt、rpm、flatpak、pacman、snap 等)。

我相信systemd和特定于操作系统(Linux 发行版、Linux init 系统)的此类内容超出了 Python 打包、pipsetuptools等的范围。尽可能合理地由setuptools负责,以便项目保持pip-installable状态,因此项目本身提供了简单的方法来访问systemd特定文件,但不安装它们(例如,可能使用命令my-thing-generate-systemd-files --target path/to/output,这将简化项目用户的任务)。另一方面,提供 Linux 发行版特定的软件包(deb、rpm 等),如果我没记错的话,有一些工具允许从 Python 项目(sdist源代码存储库)开始构建此类软件包。

一些想法(未经测试的快速搜索,不是建议):