Python 是否有一种惯用的方法使用setuptools安装systemd单元?
我正在分发一个可以导入并用作库的模块。它还附带了一个通过Python 是否有一种惯用的方法使用setuptools安装systemd单元?,python,pip,setuptools,distutils,Python,Pip,Setuptools,Distutils,我正在分发一个可以导入并用作库的模块。它还附带了一个通过控制台脚本安装的可执行文件,供人们使用 该可执行文件还可以作为systemd服务(Type=simple)启动,以向系统提供守护进程 systemd服务需要在其ExecStart行中引用绝对路径,因此我需要找出console\u脚本安装到哪里 对于其他构建系统,如CMake、autotools或Meson,我可以直接访问前缀,然后使用类似于configure_file(Meson)的东西来替换foo.service.in中的@prefix@
控制台脚本安装的可执行文件,供人们使用
该可执行文件还可以作为systemd服务(Type=simple
)启动,以向系统提供守护进程
systemd服务需要在其ExecStart
行中引用绝对路径,因此我需要找出console\u脚本安装到哪里
对于其他构建系统,如CMake、autotools或Meson,我可以直接访问前缀,然后使用类似于configure_file
(Meson)的东西来替换foo.service.in
中的@prefix@
,然后将生成的单元安装到$prefix/lib/systemd/system/
我就是不知道如何使用setuptools来实现这一点。在setup.py
中,sys.prefix
被设置为python的前缀,这与python的前缀不同。我尝试过覆盖install\u data
和install
,但这些方法都存在各种问题,例如通过pip
构建轮子时出现断裂,或者卸载时将文件留在周围。(如果没有在系统范围内安装服务,我可以不安装服务;如果前缀不是/usr
或/usr/local
,systemd将无法找到它。)
有人指着我说:
请注意,顺便说一句,数据文件的这种封装意味着您不能将数据文件安装到用户机器上的任意位置;这是一个特性,不是bug
这听起来像是我在违反规则。我真的在寻找指针或例子来告诉我我应该在这里做什么。如果这是“不要使用setuptools”,那很好,但是欢迎您提供关于首选内容的建议。我想说,不要为此使用setuptools,这不是它的用途。而是使用包管理器进行目标分发(apt、rpm、flatpak、pacman、snap等)
我相信systemd和特定于操作系统的东西(Linux发行版、Linux init系统)不在Python打包、pip、setuptools等的范围内。尽可能多地由setuptools负责,以便项目保持pip可安装,因此,项目本身提供了访问systemd特定文件的简单方法,但不安装它们(例如,可以使用命令my thing generate systemd files--target path/to/output
,这将简化项目用户的任务)。另一方面,提供Linux发行版特定的包(deb、rpm等),如果我没有弄错的话,有一些工具允许从Python项目(sdist或源代码存储库)开始构建此类包
一些想法(无需测试即可快速搜索,而非推荐):
- (摘自Fedora)
- (摘自Fedora)
- (未维护?)
- (未维护?)
- (来自Ubuntu,新标准?)
- 等等
我想说的是,不要为此使用设置工具,这不是它的用途。对于目标发行版(apt、rpm、flatpak、pacman、snap等),请使用软件包管理器。@sinoroc发行版软件包调用上游构建系统,使所有内容以正确的方式进行布局。你基本上是在告诉我,我应该自己滚动构建系统,而不是使用Python社区提供的东西吗?在这种情况下,我将编写一个介子构建文件,但我将重新发明一些逻辑,例如setuptools已经知道的逻辑,并且我将失去模块的pip安装能力(该单元是可选的),因此感觉有点悲哀。嗯,如果我能明智地包装setuptools发行版,在上面添加平台/系统特定的东西,这将是有意义的。然后它将知道前缀是什么,以便能够生成单元并使用相同的前缀调用setup.py
。我想知道这样做有多好。谢谢你的回答!