Python 3.5使用pyinstaller生成的可执行文件创建.rpm

use*_*987 6 python rpm pyinstaller rpmbuild python-3.x

我有一个使用pyinstaller生成的构建.我需要创建.rpm包,它将把可执行文件放入/usr/bin/并创建一个运行该可执行文件的systemd服务.

我发现了这个 https://docs.python.org/3/distutils/builtdist.htmlhttps://docs.python.org/2.0/dist/creating-rpms.html

但它并没有给我一个完整的图片.

  1. 有可能成功吗?

  2. 我需要使用什么工具集?(基本上,how制作它).

  3. 如果可能 - 示例代码

hoe*_*ing 9

首先,忘了bdist_rpm.这是一个distutils/ setuptoolsproject,所以你需要一个在引擎盖下setup.py调用的脚本pyinstaller来捆绑可执行文件,以某种方式重新定义install_scripts命令以便能够打包二进制可执行文件并处理systemd单元文件的打包.而是编写一个spec文件,这是rpm构建和安装包的说明手册.

建立

这是一个可以使用的示例项目.

so-51640995
??? bacon.service
??? bacon.spec
??? bacon.timer
??? spam.py
Run Code Online (Sandbox Code Playgroud)

spam.py

这里没有魔法 - 打印eggs过一次.将捆绑pyinstaller到一个名为的二进制文件bacon.我没有调用项目spam来避免歧义,因为pyinstaller还创建了一个带.spec扩展名的文件,因此运行它不会覆盖rpm spec文件.

#!/usr/bin/env python3

def eggs():
    print('eggs!')


if __name__ == '__main__':
    eggs()
Run Code Online (Sandbox Code Playgroud)

bacon.service

简单的服务调用二进制bacon.

[Unit]
Description=Bacon emitting eggs

[Service]
ExecStart=/usr/bin/bacon
Restart=always
Run Code Online (Sandbox Code Playgroud)

bacon.timer

bacon每十秒钟打一次电话.

[Unit]
Description=Timer for bacon to emit eggs from time to time

[Timer]
OnUnitInactiveSec=10s
OnBootSec=10s
Unit=bacon.service

[Install]
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)

bacon.spec

包的说明.在%build节中,我们捆绑spam.py,则捆绑的可执行文件安装dist/spam/usr/bin/bacon与沿systemd单元文件.

Name: bacon
Version: 1
Release: 1
Summary: bacon that shouts 'eggs!' from time to time
License: MIT
Requires: systemd

%description
bacon that shouts 'eggs!' from time to time

%build
pyinstaller --onefile %{_sourcedir}/spam.py

%install
mkdir -p %{buildroot}%{_bindir}
mkdir -p %{buildroot}%{_unitdir}
install -m 755 dist/spam %{buildroot}%{_bindir}/bacon
install -m 755 %{_sourcedir}/bacon.service %{buildroot}%{_unitdir}/bacon.service
install -m 755 %{_sourcedir}/bacon.timer %{buildroot}%{_unitdir}/bacon.timer

%files
%{_bindir}/bacon
%{_unitdir}/bacon.service
%{_unitdir}/bacon.timer
Run Code Online (Sandbox Code Playgroud)

构建包

有很多教程可以rpm深入解释构建包,例如Fedora Packaging Guidelines,所以只需在此处列出最小的命令序列:

$ # install the bare minimum of required packages
$ sudo dnf install rpm-build rpm-devel rpmdevtools
$ # first-time setup of build dirs
$ rpmdev-setuptree
$ # copy the source files
$ cp * $HOME/rpmbuild/SOURCES/
$ # invoke the build
$ rpmbuild -ba bacon.spec
Run Code Online (Sandbox Code Playgroud)

测试包

$ sudo rpm -ivp $HOME/rpmbuild/RPMS/x86_64/bacon-1-1.x86_64.rpm
Run Code Online (Sandbox Code Playgroud)

编辑:如评论中所述,使用-U赞成-i.从rpm勒芒引用:

rpm升级命令的一般形式是

 rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
Run Code Online (Sandbox Code Playgroud)

这会将当前安装的软件包升级或安装到较新版本.这与安装相同,除了在安装新软件包后删除软件包的所有其他版本.

所以使用

$ sudo rpm -Uvp $HOME/rpmbuild/RPMS/x86_64/bacon-1-1.x86_64.rpm
Run Code Online (Sandbox Code Playgroud)

用于测试安装.

现在bacon应该可以从命令行获得:

$ bacon
eggs!
Run Code Online (Sandbox Code Playgroud)

启动计时器:

$ sudo systemctl start bacon.timer
$ systemctl status bacon.timer
? bacon.timer - Timer for bacon to emit eggs from time to time
   Loaded: loaded (/usr/lib/systemd/system/bacon.timer; disabled; vendor preset: disabled)
   Active: active (waiting) since Tue 2018-08-07 15:36:28 CEST; 29s ago
  Trigger: Tue 2018-08-07 15:36:58 CEST; 979ms left
Run Code Online (Sandbox Code Playgroud)

检查日志:

$ sudo journalctl -u bacon
-- Logs begin at Mon 2017-07-03 12:49:51 CEST, end at Tue 2018-08-07 15:37:02 CEST. --
Aug 07 15:36:28 XXX systemd[1]: Started Bacon emitting eggs.
Aug 07 15:36:28 XXX bacon[128222]: eggs!
Aug 07 15:36:28 XXX systemd[1]: bacon.service: Service hold-off time over, scheduling restart.
Aug 07 15:36:28 XXX systemd[1]: Stopped Bacon emitting eggs.
Aug 07 15:36:28 XXX systemd[1]: Started Bacon emitting eggs.
Aug 07 15:36:28 XXX bacon[128224]: eggs!
Aug 07 15:36:28 XXX systemd[1]: bacon.service: Service hold-off time over, scheduling restart.
Aug 07 15:36:28 XXX systemd[1]: Stopped Bacon emitting eggs.
Aug 07 15:36:28 XXX systemd[1]: Started Bacon emitting eggs.
Aug 07 15:36:29 XXX bacon[128226]: eggs!
...
Run Code Online (Sandbox Code Playgroud)

验证完成后,停止计时器并卸载bacon:

$ sudo systemctl stop bacon.timer
$ sudo rpm -e bacon
$ sudo systemctl daemon-reload
$ sudo systemctl reset-failed
Run Code Online (Sandbox Code Playgroud)