Linux可执行文件制作

article/2025/1/13 13:06:36

Linux可执行文件制作

背景

测试过程中,需要针对不同的Linux系统、核心服务版本进行验证,各种环境依赖的python版本以及已安装的库存在较大差异,考虑到实际测试需求以及出差现场使用的要求,需要将测试脚本打包为可执行文件,可以最大程度上减少依赖,保障测试程序的可用性和易用性。本文介绍一种利用python的pyinstaller库,将程序打包为可执行文件的方式,脱离自动化工程或复杂的环境配置。后半部分针对一些固有化的实现进行介绍,希望对大家有所帮助。

环境配置

当前使用的编程语言为python3,建议在测试服务器上安装python3,将能够更好地进行兼容。

Python3环境安装问题

  可参考https://wiki.hikvision.com.cn/pages/viewpage.action?pageId=49800240

Pyinstaller安装及使用

安装

(1)方式一:直接用pip安装

pip install pyinstaller

(2)方式二:源码安装

下载pyinstaller安装包后执行以下命令手动安装:

tar -zxvf PyInstaller-3.6.tar.gz

cd PyInstaller-3.6/

python3 setup.py build

python3 setup.py install

如果输入 pyinstaller 命令可以直接使用,那就可以了。

  • 问题1:输入pyinstaller命令提示 command not found

解决方式:复制pyinstaller到/usr/bin/下

cd /usr/local/python3/bin/

cp pyinstaller /usr/bin/.

  • 问题2:python setup.py build报错

  • 解决:需要升级setuotool的版本

wget https://pypi.python.org/packages/41/80/268fda78a53c2629128f8174d2952c7f902c93ebaa2062b64f27aa101b07/setuptools-38.2.3.zip#md5=0ae64455d276ff864b40aca9c06ea7c1

unzip setuptools-38.2.3.zip

cd setuptools-38.2.3

python setup.py install

 

  • 问题3:包依赖关系处理

在linux下安装rpm包的时候发现,安装一个服务需要安装很多rpm包,比如安装apache,最少需要安装3-4个包,当然主包只有一个,其中还有好多依赖关系,甚至会出现循环依赖的“死锁”。为了避免包之间的依赖关系问题,可以采取同时安装所有有关rpm包的方式:

rpm -ivh xx1.rpm xx2.rpm xx3.rpm

 

使用

  Pyinstaller使用方法:

rpm -ivh xx1.rpm xx2.rpm xx3.rpm

 

  • 打包成功后有缺失包

安装时,wheel库通过python setup.py build & python setup.py install 安装失败。需要先将wheel文件下载到本地,然后pip install ...wheel。
资源链接:各种python wheel文件

 

  • 包缺失

问题:python用pyinstaller打包时,打包的py文件中有import paramiko,打好包后的文件执行时提示,No module named paramiko。

解决:添加一个-p的参数。如:

pyinstaller -F xx.py -p paramiko

 

  • Hidden-import

常用关键字及代码

(1)日志输出

当前可执行文件执行,会在控制台输出必要的结果,但对于问题的排查或记录来说还是比较麻烦,为生成便于问题定位及结果记录的日志文件,使用python中的logging模块。

logging模块主要提供了一些函数和类来支持灵活地输出日志,实现日志系统相应的功能,可以使用到应用程序和库里。主要提供了类Logger、Handler、Filter和Formatter。

 

日志总共定义的级别:

 

CRITICAL   50

ERROR     40

WARNING  30

INFO       20

DEBUG     10

NOTSET     0

 

 

使用举例:

# INFO级别输出一条日志。

logging.info(msg, *args, **kwargs)

 

#level级别输出一条日志。

logging.log(level, msg, *args, **kwargs)

 

# 设置那一级别的日志不再输出。

logging.disable(lvl)

(2)解密

def _decode_password(self, encode_password):
   
"""
   
对加密的密码进行处理, jar包实现
   
:return: str
    """
   
java_path = 'jdk1.8.0_161/bin/java'
   
subprocess.getoutput('chmod 777 %s' % java_path)
    cmd = java_path +
' -jar decode.jar'
   
decode_result = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)
    decode_result.stdin.write(encode_password.encode(
'gbk') + b'\r\n')
    out
, err = decode_result.communicate()
   
try:
        file_context = out + err
        file_context = file_context.decode(
'utf8')
        decode_password =
str(file_context.split("密码:")[1])
        decode_password = decode_password.rstrip(
'\r\n')
        decode_password = decode_password.rstrip(
'\n')
        logging.info(
"the password decoded%s" % decode_password)
        result = decode_password
   
except Exception as e:
        logging.info(
"the password decoded failed")
        logging.debug(e)
        result =
False
    return
result

(3)配置获取(以redis配置获取为例)

def get_conf_redis(self):
   
"""获取redis配置信息"""
   
conf_content = subprocess.getoutput("cat %s/../components/redislinux64.1/conf/config.properties\n" % self.path)
    redis_conf = {}
   
for conf in conf_content.splitlines():
       
# centerdb数据库
       
if conf.find('cache.1.@ip=') >= 0:
            redis_conf[
'redis_ip'] = conf.split('ip=')[-1]
       
elif conf.find('cache.1.port=') >= 0:
            redis_conf[
'redis_port'] = conf.split('port=')[-1]
       
elif conf.find('cache.1.password=') >= 0:
            cas_password = conf.split(
'password=')[-1]
            redis_conf[
'redis_password'] = self._decode_password(cas_password)
   
return redis_conf

(4)在linux上远程其他服务器(以读取文件为例)

def ssh_machine_file_path(self, machine):
   
"""ssh连接,获取文件路径"""
   
# 实例化SSHClient
   
ssh = paramiko.SSHClient()
   
# 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
   
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

   
# 连接SSH服务端,以用户名和密码进行认证
   
ssh.connect(hostname=machine[0], port=machine[1], username=machine[2], password=machine[3])
   
# 执行
   
stdin, stdout, stderr = ssh.exec_command('find %s/components/*/conf -type f -name "config.properties"' % self.path)
   
# 打印执行结果
   
result = stdout.read().decode('utf-8')
    result = result.split(
'\n')

   
for i in result[::-1]:
       
if 'fail' in i or i == '':
           
print(i)
            result.remove(i)

    result.append(
'%s/opsMgrAgent/conf/config.properties' % self.path)

   
print(result)
    ssh.close()
   
return result

(5)配置文件处理

def set_section_variables(self, section, dict_value, ini_name='use_dict_ip'):"""写入section的值
:param section: str:param dict_value: dict:param ini_name:"""if ini_name == 'use_dict_ip':try:ini_name = dict_value['bic_ip']except KeyError as e:raise Exception('dic_has_no_key:%s' % e)#config_path = os.path.join(self.service_path, 'variables.ini')config = configparser.ConfigParser()config.read(self.config_path, encoding='utf-8')if not config.has_section(section):config.add_section(section)for key, value in dict_value.items():config.set(section, key, value)config.write(open(self.config_path, "w", encoding='utf-8'))def del_section_variables(self, section):config = configparser.ConfigParser()config.read(self.config_path, encoding='utf-8')if config.has_section(section):config.remove_section(section)config.write(open(self.config_path, "w", encoding='utf-8'))

环境分享

pyinstaller –F xx.py


http://chatgpt.dhexx.cn/article/hNdU3iFW.shtml

相关文章

如何将Python程序打包成linux可执行文件

如何将Python程序打包成linux可执行文件 方法1.安装环境2.打包程序3.执行文件 方法 前段时间尝试使用Python的tkinter制作了一个简单的丑丑的图形化界面,现在想把它打包成Linux可执行文件,具体步骤如下: 1.安装环境 使用的工具是pyinstall…

linux 运行可执行文件

本文只为整理思路,供自己日后参考。现在就从从一个执行文件a.out的运行开始,自上而下地分析linux是如何运行一个执行文件的。 1、首先,需要了解一下a.out这个目标文件。a.out在linux下是ELF(Executable Linkable Format)文件格式,该目标文件由一个文件头、代码段、数据段…

从零编写linux0.11 - 第十一章 可执行文件

从零编写linux0.11 - 第十一章 可执行文件 编程环境:Ubuntu 20.04、gcc-9.4.0 代码仓库:https://gitee.com/AprilSloan/linux0.11-project linux0.11源码下载(不能直接编译,需进行修改) 本章目标 本章会加载并运行…

Linux可执行文件

文章目录 1. 什么是可执行文件2. 可执行文件的区别./ 表示什么?为什么是/usr/bin?总结 1. 什么是可执行文件 可执行文件指的是这个文件可以被运行.这个文件可以是一个代码文件,也可以是一个二进制文件 Linux文件系统中只有文件和目录(一切皆文件). 在Linux中,运行一个文件的…

技术人员如何创业(1)---产品及想法

不得不说这是个浮躁的社会,人人在这个社会都想暴富或者成名。在这些引诱的驱使下很多人都脱离了原来的稳定工作创业。前几天看了《中国合伙人》,故事讲到了几个大学生从校园到工作、再到创办了一个伟大的企业,这个故事更加激励了创业大军的壮…

蓝河科技10个月创立3.05亿美元的农业机器人公司

从创业构想到模式验证,仅10个月如何做到? 蓝河科技(Blue River Technology)是一家成立于2011年的农业机器人公司,总部位于硅谷,主营业务为设计、生产和销售农业机器人,农业机器人租赁业务和相关…

重新理解创业:一个创业者的途中思考

内容简介 易到用车创始人/顺为资本投资合伙人周航,首度复盘20年创业经历,全方位坦陈创业得与失。这不是一本创业成功手册,却是思想的一次出走。20年创业经历的咀嚼与反思,从战略、品牌、竞争,到流量、领导力、团队管理…

创业案例|10个月$3亿市值的农业智能科技如何实现

如何在10个月内快是实现创业从构想到模式验证,6年后以3个多亿美元成功被收购。本文是蓝河科技创始人Jorge和Lee自述,如何通过精益创业的关键三个阶段:客户问题匹配、问题方案匹配、方案市场匹配,实现了本成本试错、高效率推进的从…

计算机毕设题目推荐

计算机软件的朋友们不知道选什么题目的看过来啦👈 图片中都是做过的毕设供大家参考,有源码的哦 ps:有新颖想法的宝子们也可以留言分享一下呢 #Java毕业设计 #计算机毕业设计 #计算机毕业设计怎么做

计算机毕设题目设计与实现(论文+源码)_kaic

毕业设计(论文)题目 高校图书馆座位预约选座微信小程序设计与实现 基于防火墙的访问控制系统的设计与实现 基于区块链的农产品追溯系统设计与实现 学生公寓楼改造布线系统规划与设计 智能家居网络设计与实现“互联网”农村精准扶贫共享平台的设计与实现“智慧健康少儿成长平台”…

计算机毕设选题推荐 40个高质量项目分享【源码+论文】(二)ssm+vue

文章目录 前言 课题1 : 基于SSM与VUE的房屋出租出售系统 <br /> 课题2 :基于SSM与VUE的租房信息管理系统 <br /> 课题3 : 基于SSM与VUE的个人健康信息管理系统 <br /> 课题4 : 基于SSM与VUE的共享充电宝管理系统 <br /> 课题5 : 基于SSM的健身运动平台…

计算机毕设太简单会不会过不了 SSM公司设备管理系统 企业员工工资管理系统 公司员工工资管理系统Java

精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设老哥&#x1f525; &#x1f496; Java实战项目专栏 Python实…

计算机java毕设_javaweb计算机毕设怎么做比较容易?

---计算机毕业生常见毕设 计算机毕业设计一般以网站多见 基于PHP网上留言系统JAVA打飞机游戏设计java图形图象处理系统JAVA银行帐目管理系统基于网络超市商品销售管理基于J2EE的公交查询系统JSP实验教学管理系统jsp进销存管理系统JSP网上书店系统JSP人力资源管理系统这些题目都…

计算机毕设如何做?点进来,干货分享。

该死的疫情席卷整个神州大地&#xff0c;不知道何时才是尽头&#xff0c;很多小伙伴都已经在家里开始种香菇了。面对遥遥无期的开学时间和即将面临的毕业最后一个大考&#xff08;毕业设计&#xff09;&#xff0c;心中即是期待又是无奈&#xff0c;陆陆续续在家这段时间&#…

【计算机毕设】项目数据库设计

计算机毕设系列文章目录 第一章 毕设题分析及设计 第二章 项目数据库设计 第三章 maven项目搭建 第四章 前端文件结构 第五章 后台登录功能实现 第六章 后台登出功能实现 第七章 项目功能实现 第八章 项目功能实现 第九章 项目功能实现 第十章 项目功能实现 文章目录 计算机毕…

计算机毕设系统项目说明 【源码+论文】

文章目录 1 项目下载步骤2 项目包含内容3 样例展示4 代码样例 1 项目下载步骤 &#x1f525;Hi&#xff0c;大家好&#xff0c;这里是学长开发的Java web项目系列&#xff0c;大家可以用于自己的课设或毕设。 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传…

计算机毕业设计选题推荐 40个高质量计算机毕设项目分享【源码+论文】(二)

文章目录 前言 题目1 : 基于SSM的房屋出租出售系统 <br /> 题目2 : 基于SSM的房屋租赁系统 <br /> 题目3 : 基于SSM的个人健康信息管理系统 <br /> 题目4 : 基于SSM的共享充电宝管理系统 <br /> 题目5 : 基于SSM的即动运动网站 <br />项目源码 前…

【计算机毕设】毕设题分析及设计

计算机毕设系列文章目录 第一章 毕设题分析及设计 第二章 项目数据库设计 第三章 maven项目搭建 第四章 前端文件结构 第五章 后台登录功能实现 第六章 后台登出功能实现 第七章 项目功能实现 第八章 项目功能实现 第九章 项目功能实现 第十章 项目功能实现 文章目录 计算机毕…

2022年 - 2023年 最新计算机毕业设计 本科 选题大全 汇总

文章目录 0 前言1 java web 管理系统 毕设选题2 java web 平台/业务系统 毕设选题3 游戏设计、动画设计类 毕设选题 (适合数媒的同学)4 算法开发5 数据挖掘 毕设选题6 大数据处理、云计算、区块链 毕设选题7 网络安全 毕设选题8 通信类/网络工程 毕设选题9 嵌入式 毕设选题10 开…

计算机毕业设计看这篇就够了(二)毕设流程

本篇将为大家介绍计算机专业毕业设计流程&#xff0c;提前了解毕设流程可以让同学们从宏观角度去看毕设要做些什么样的事情&#xff0c;大概知道每个阶段要去做哪些工作&#xff0c;为后续毕设任务的真正开展打下心理预期&#xff0c;也不至于一脸懵。 计算机毕设分为以下主流程…