文章重组提示 240730

本文将以下文章进行聚合:

  • 【麒麟实训】Deb 的打包(小练习分享)
  • 【麒麟实训】撷英 1 - Pyqt 程序编译与打包探索
  • 【麒麟实训】撷英 2 - Python 代码控制 word 文档模板
  • 【麒麟实训】撷英 3 - Python 执行 Linux 命令公共方法

【麒麟实训】Deb 的打包(小练习分享)

练习 Deb 的打包流程。本文章为一次小练习的记录,操作过程多少有瑕疵,可能不适合实践参考。“实训撷英”专栏将有更专门的打包介绍。

文章部分内容来源于我的实训工作文档:《练习 1 过程文档(改进)》、《练习 2 过程文档(改进)》。规范的打包过程请参考《麒麟软件打包规范》。

Deb 的二进制文件打包

创建 DEBIAN 文件夹、etc、opt、usr 文件夹。

目录格式:

在 DEBIAN 文件夹下创建 control 文件:

企业老师给出的意见:

control 文件中包含空的关键字,应该删除,如 section 无对应信息则不存在。

最终的目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
.
├── DEBIAN
│ └── control
├── etc
├── opt
│ └── sublime-text
│ ├── changelog.txt
│ ├── crash_reporter
│ ├── Lib
│ ├── libcrypto.so.1.1
│ ├── libssl.so.1.1
│ ├── Packages
│ ├── plugin_host-3.3
│ ├── plugin_host-3.8
| ├── Icon
│ └── sublime_text
└── usr
└── share
└── applications
│ └── sublime_text.desktop
└──icons
└── hicolor
├──128x128
│ └── apps
│ └── sublime-text.png
└──256x256
... ...

打包:

1
sudo dpkg -b project project_v1.0.0_amd64.deb

安装:

1
sudo dpkg -i project_v1.0.0_amd64.deb

新程序

运行效果

卸载:

1
2
3
4
sudo dpkg -r project

# 干净卸载:
sudo dpkg -P sublime-text

参考:deb打包流程步骤_逐渐江江江江化的博客-CSDN博客_deb打包

问题解决

开始菜单图标显示不出来的问题

请注意:图标目录Icons的名称和位置进行正确的设置、以及放置。参看上文给的目录树。

比如正确的放置方法时:icons/hicolor/128x128/下,还需要建立 apps 文件夹,里面放置 png 图标。

打包报错:软件包名字错误

注意,“Package”字段的内容,用“-”(减号)不用“_"(下划线)哦,否则会报以下错误:

借 shibo 同学的图

打包报错:与本机架构不符

1
sudo dpkg --add-architecture amd64

参考:Ubuntu使用dpkg查看与修改architecture的用法_qiuchangyong的博客-CSDN博客

Deb 源码打包

下载源码压缩包,解压。

1
tar zxvf p7zip.tar.gz

将解压后的文件移动到构造好的目录中,得到以下目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.
├── opt
│ └── apps
│ └── p7zip
│ ├── Asm
│ │ └── x86
│ ├── C
│ ├── check
│ ├── contrib
│ ├── CPP
│ ├── DOC
│ ├── GUI
│ ├── man1
│ └── Utils // 不应该存放源码
└── usr
└── share
├── applications
└── icons
└── hicolor

企业老师给出的意见:

_ 不应该 _ 将源码文件全部存放到/opt/apps/p7zip 目录下(因为是二进制软件包,不应该将源码存放到对应目录下);不应该有空目录/usr/share/icons/hicolor

在/p7zip-16.02 目录下执行指令:

1
dh_make --createorig -s

生成 debian 文件夹。

image-20220506102802357

修改 debian/control

image-20220506104427558

在 rules 中添加 Override:

image-20220506104934917

在 debian 下创建 install 文件,并写入以下内容:

image-20220506110213565

执行 debuild 命令:

1
2
3
4
debuild -i -us -uc -b

# 生成过程需要补充安装以下软件(Build-Depends)
sudo apt-get install debhelper

这时,在源码文件的上一级目录会多出几个文件,其中就包括 deb 包:

image-20220506110901935

执行安装:

1
sudo dpkg -i p7zip_16.02_all.deb

查看安装效果:

1
sudo dpkg -l p7zip

image-20220428215252343

可以正常卸载:

1
sudo dpkg -P p7zip

卸载后查找不到 p7zip。

image-20220506111234325

Deb 源码打包(野生方法)

从网上找来的自己摸索的方法。可能不符合麒麟软件的打包规范。这是初次练习的成果。

安装需要的工具:

1
2
3
sudo apt-get install debmake
sudo apt-get install python3-debia
sudo apt-get install build-essential

生成 debian 文件夹配置文件:

1
debmake -e [email protected] -p p7zip -u 16.02 -f "unknow unknow" -n

命令解释:

  • 邮件地址 [email protected]
  • 软件包名 p7zip
  • 软件版本号 16.02
  • 作者全名 unknow unknow

命令执行后,会多出 debian 文件夹:

QQ截图20220427123914

编辑 debian/control

QQ截图20220427235600

生成 deb 包:

1
2
3
4
sudo dpkg-buildpackage -us -uc -tc

# 生成过程需要补充安装以下软件(Build-Depends)
sudo apt-get install debhelper

这是,在源码文件的上一级目录会多出几个文件,其中就包括 deb 包:

QQ截图20220427230246

执行安装:

1
sudo dpkg -i p7zip_16.02_amd64.deb

查看安装效果:

1
sudo dpkg -l p7zip

QQ截图20220427235449

参考:debmake - CSDN

其他

虚拟机 Kylin 系统的安装

请参看:使用VirtualBox安装Kylin桌面版操作系统 - 简书 (jianshu.com)

屏幕调大的命令:

1
xrandr -s 1920x1200_60 # 在麒麟终端输入

自己多试一下:

图片失效

原文此位置包含图片,现链接已被覆盖造成丢失,且复查时存在疏漏。原图片命名为:image-70.png

或者在麒麟桌面设置那里调,一劳永逸。

tree 命令

安装:

1
$ sudo apt-get install tree

使用:

1
2
$ tree
$ tree -d # 仅列出目录

参考:linux tree命令,Linux tree命令实例详解_章鱼老师的博客-CSDN博客

【麒麟实训】撷英 1 - Pyqt 程序编译与打包探索

本篇文章内容仅供简略参考。

文章内容来源于我的飞书文档>麒麟实训>大作业 - 编译与打包,更多问题的详细记录、示例文件以及调研文档请参看源文档。

Python 源码编译

python 编译

安装 pyinstaller:

1
pip install https://github.com/pyinstaller/pyinstaller/tarball/develop

只需对入口文件执行命令:

1
2
3
# 两种打包方式
pyinstaller -F run.py # 打包成一个二进制文件,但启动速度慢
pyinstaller -D run.py # 打包出多个文件,程序启动速度快

参考:

Python PyInstaller安装和使用教程(详解版) (biancheng.net)

PyQt5软件打包_王火火的博客-CSDN博客_pyqt打包

Pyqt 窗口图标

关于应用程序窗口图标显示问题可参考:http://t.zoukankan.com/jingsupo-p-13536449.html

加代码的地方:在 ui 转成的.py 文件

1
self.setWindowIcon(QIcon(':/signal-slot-demo.ico'))

打包后,编译生成的二进制文件的同级目录需要放上图标。

打包过程总览

  1. 按照《麒麟软件打包规范》构造 deb 包目录
  2. 打开源码项目执行 pyinstaller -D run.py -n signal-slot-demo
  3. 在 pyinstaller 中生成的 signal-slot-demo 文件夹中添加 icon 图标。并将该文件夹放入构造好的 deb 包目录下的/opt/apps/中

img

  1. 进入构造好的目录,执行命令:debuild -i -us -uc -b
  2. 返回上一级目录执行:sudo dpkg -i signal-slot-demo_1.0.0-1_all.deb

结果:运行正常。窗口图标、任务栏图标、开始菜单栏图标运行正常。(开始菜单栏中的图标是.desktop 文件中 Icon 指定的 svg 图标。程序窗口以及任务栏图标是 Pyqt 中代码指定的图标。)

具体文件示例

Control 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Source: signal-slot-demo
Version: 1.0.0
Maintainer: Wu WanQin <[email protected]>
Section: unknown
Priority: optional
Build-Depends: debhelper
Standards-Version: 4.4.1
Homepage: https://uuanqin.top

Package:signal-slot-demo
Multi-Arch: foreign
Architecture: all
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: 信号与信号槽示例。

Install 文件

1
2
opt/apps/signal-slot-demo/ /opt/apps
usr/share /usr/

.desktop 文件

1
2
3
4
5
6
7
8
9
[Desktop Entry]
Name=Signal-Slot-Demo
Comment=An example
Exec=/opt/apps/signal-slot-demo/signal-slot-demo %F
Icon=/usr/share/icons/scalable/apps/signal-slot-demo.svg
Terminal=false
Type=Application
X-Ubuntu-Touch=true
Categories=Office

【麒麟实训】撷英 2 - Python 代码控制 word 文档模板

通过 python 是可以控制 word 文档内容的,本篇文章简要介绍其原理,具体实现与实际案例可看我的开源项目。详细文档可查看我的飞书文档>麒麟实训>大作业 - 文档生成工具

简介

文档生成工具主要通过对自动化适配工具生成的 csv 报告、html 报告进行读取、解析、整理,进而生成指定的 word 总报告。

项目地址:https://gitee.com/uuanqin/report_generator.git

基本原理

每一个 word 文档都可以通过 xml 表示,这个 xml 中包含文字信息和格式信息。通过给定的 doc 报告模板,我们可以以 xml 的方式进行操作,在实现增删改查 xml 元素的同时保持原有给定的格式基本不变。

业务流程

伪代码:

  • 获取所有生成最终报告需要的源报告路径
  • 根据路径对文件及文件夹进行读取
  • 对每个文件中的数据提取、解析、整理
  • 读取报告模板,填写每个部分的 word 表格
  • “FAIL",“PASS” 字体染色
  • 保存为中间文件 temp.xml
  • 读取 temp.xml,替换其中的变量,保存为中间文件 麒麟操作系统适配认证自动化测试报告.xml
  • 移动 麒麟操作系统适配认证自动化测试报告.xml 到目标文件夹中,修改后缀为.doc

效果示例

image-20220701160509387

文档对象插入

关于 python 控制 word 中的文档对象可查看以下方法:

python在word文档里插入文件对象_奶爸大山的博客-CSDN博客_python word附件

经我与导师们实际调研与操作得到以下结论:

  • 需要事先在 word 插入好文档对象,我们才可能通过代码改变这个文档对象。
  • python 代码中只能改变文档对象指向的内容,新增加文档对象。
  • 支持改变的文档对象只能是 xlsx 格式或 docx 格式,其他格式的文档对象插入时,生成的 ole.bin 文件暂时没找到办法进行生成。

【麒麟实训】撷英 3 - Python 执行 Linux 命令公共方法

废话不说,show you my code,自己看。

这些公共方法可以直接用于执行 sudo 指令、验证用户密码、以及执行普通命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
def sudo_verify(password:str):
"""
在使用sudo命令之前最好调用一次该程序验证sudo密码的正确性。
:param password: 需要验证的密码
:return: 布尔类型 表示通过与否,字符串类型表示返回信息。(密码正确时返回空串)
"""
test_str = 'sudo test'

echo = subprocess.Popen(['echo', password], stdout=subprocess.PIPE, )

sudo = subprocess.Popen(['sudo', '-S', 'echo', test_str],
stdin=echo.stdout,
stdout=subprocess.PIPE,
# stderr=subprocess.PIPE
)

return_str = sudo.stdout.read().decode().replace("\n","")
if return_str == test_str:
return True,""
else:
return False,return_str.replace("\n","")

def sudo_do_something(password:str,command:list):
"""
调用此方法以执行需要加sudo的命令。
:param password: 密码
:param command: 列表,如:['./run.sh', test_type, debpkg]
:return:
"""
is_pass,rtstring=sudo_verify(password)
if is_pass:
echo = subprocess.Popen(['echo', password], stdout=subprocess.PIPE, )
sudo = subprocess.Popen(['sudo', '-S'] + command,
stdin=echo.stdout,
stdout=subprocess.PIPE,
# stderr=subprocess.PIPE
)

rtstring = sudo.stdout.read().decode()
return is_pass,rtstring

def command(command):
p = subprocess.Popen(command,
# stdin=echo.stdout,
stdout=subprocess.PIPE,
# stderr=subprocess.PIPE
)

rtstring = p.stdout.read().decode()
return rtstring