【问题标题】:Is there an idiomatic way to install systemd units with setuptools?有没有一种惯用的方法来使用 setuptools 安装 systemd 单元?
【发布时间】:2020-05-18 08:29:28
【问题描述】:

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

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

systemd 服务需要在其ExecStart 行中引用绝对路径,因此我需要弄清楚console_script 的安装位置。

使用 CMake、autotools 或 Meson 等其他构建系统,我可以直接访问前缀,然后使用 configure_file (meson) 之类的东西替换 foo.service.in 中的 @PREFIX@,然后将生成的单元安装到 @987654330 @。

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

有人指点我at a website which says that you're not supposed to do this with setuptools:

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

这听起来像是我在这里违背了常规。我真的在寻找指针或例子来告诉我我应该在这里做什么。如果那是“不要使用 setuptools”,那很好 - 但是欢迎就首选的东西提出建议。

【问题讨论】:

  • 我会说不要为此使用 setuptools,这不是它的用途。而是使用目标发行版的包管理器(apt、rpm、flatpak、pacman、snap 等)
  • @sinoroc 分发包调用 upstream 构建系统以使所有内容以正确的方式布局。你基本上是在告诉我应该自己推出构建系统,而不是使用 Python 社区提供的东西吗?在这种情况下,我将编写一个 Meson 构建文件,但我会重新发明逻辑,例如setuptools 已经知道了,我会失去模块的 pip 可安装性(该单元是可选),所以感觉有点难过。

标签: python pip setuptools distutils


【解决方案1】:

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

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

一些想法(无需测试的快速搜索,非推荐):

【讨论】:

  • 嗯,如果我可以明智地包装 setuptools 发行版以在顶部添加平台/系统特定的东西,那将是有意义的。然后它将知道能够生成单元的前缀是什么,并使用相同的前缀调用setup.py。我想知道这样做的好方法是什么。感谢您的回答!
猜你喜欢
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
相关资源
最近更新 更多