【发布时间】: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_data 和install,但是这些方法都有各种问题,例如在通过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