迷你软件制作
迷你软件制作
陈家栋 发表于2年前
迷你软件制作
  • 发表于 2年前
  • 阅读 37
  • 收藏 1
  • 点赞 1
  • 评论 0

华为云·免费上云实践>>>   

摘要: 这篇博文主要讲得是如何将python的py文件转换为可执行文件,这样就可以在不同的平台上运行我们自己做的软件啦! 这里的程序实现的功能是,从用户终端提取终端信息,然后发送到服务器上,由服务器存储到数据库中。 最后生成的文件只适合Windows平台哦!

一、需求

做个可执行文件,让用户在自己的机器上双击执行后,可以把以下信息发送到服务器:

1、  主机名

2、  CPU型号信息

3、  内存

4、  IP地址

5、  操作系统版本

6、  磁盘大小

7、  应用列表

服务器接收到这些数据之后,会将它们存储在数据库中,以便管理员进行查询。

二、环境介绍

服务器:使用Ubuntu14.04作为信息接收与信息处理的服务器。

客户端:支持win7win10win2008win2012

数据库:在服务器上使用python自带的sqlite3来保存数据,无用户名和密码,可以直接对数据库进行查询。

三、步骤

1、制作客户端程序

1)安装psutil模块

该模块用于提取终端信息。具体安装如下:

#先安装pip
C:\Users\SoSoul>python -m pip install --upgrade pip
#用pip安装psutil
C:\Users\SoSoul>python -m pip install psutil

        2dataTransfer.py

主要用途:主要用于将用户终端的信息发送给服务器。用pickle将信息存储,并且通过socketpickle文件中的二进制内容发送到服务器上。

实现代码:

import pickle
import extractInfoWin
from socket import *
 
#extract host information and write them to file using pickle
endpointInfo = extractInfoWin.finalAllInfo()
endpointFile = open('ep.pkl', 'wb')
pickle.dump(endpointInfo, endpointFile)
endpointFile.close()
 
#send information to the server
serverIP = '10.33.140.76'
serverPort = 8888
sockobj = socket(AF_INET, SOCK_STREAM)
sockobj.connect((serverIP, serverPort))
 
endpointFile = open('ep.pkl', 'rb')
msg = endpointFile.read(1024)
while msg:
         sockobj.send(msg)
         msg = endpointFile.read(1024)
endpointFile.close()
sockobj.close()

        3extractInfoWin.py

主要用途:主要用于提取用户终端的信息。

实现代码:

import sys 
import os  
import atexit 
import time  
import psutil  
import socket
import cpuinfo
import platform
from winreg import *
 
def getHostname():
    return socket.gethostname()
 
def getCPUModel():
    s = cpuinfo.finalResult().split(':')[1]
    return s
   
 
def getMemorystate():  
    phymem = psutil.virtual_memory() 
    line = ("Memory: %s"%(str(int(phymem.total/1024/1024))+"M"  )).split(':')[1]
    return line
 
def getlocalIPs():
    hostname = socket.gethostname()
    IPinfo = socket.gethostbyname_ex(hostname)
    allIP = IPinfo[2]
    return allIP
 
def getOSVersion():
    return platform.platform()
 
def getDiskInfo():
    total = 0
    for x in ('a','b','c:','d:','e:','f:','g','h','i','j'):
        try:
            s = str(psutil.disk_usage(x))
            s = s.split(',')[0]
            s = s.split('=')[1]
            size = int(s)/1024/1024/1024
            total = total+size
        except:
            continue
    return str('%.2f' % total)+'G'
 
def getSoftware():
    #print('Installed Softwares:')
    aReg = ConnectRegistry(None,HKEY_LOCAL_MACHINE)
    aKey = OpenKey(aReg, r"SOFTWARE")
    softwarelist = []
    for i in range(1024):
        try:
            softwarelist.append(EnumKey(aKey,i))
        except:
            break
    CloseKey(aKey)
    CloseKey(aReg)
    #print(softwarelist)
    return softwarelist
 
def finalAllInfo():
    hostInfoMap = {}
    keylist = ['Hostname','CPU','Memory','IP','OSversion','Disk','AppList']
    valuelist = []
    valuelist.append(getHostname())
    valuelist.append(getCPUModel())
    valuelist.append(getMemorystate())
    valuelist.append(getlocalIPs())
    valuelist.append(getOSVersion())
    valuelist.append(getDiskInfo())
    valuelist.append(getSoftware())
    hostInfoMap = dict(zip(keylist, valuelist))
    return hostInfoMap

        4cpuinfo.py

主要用途:主要用于提取用户终端的CPU型号信息。

实现代码(本代码摘自网上,最后添加了一个返回信息的函数):

       注意: 由于本模块过大,所以等会提供下载链接!

2、制作服务器端程序

1dataProcessServer.py

主要用途:主要用于接收用户终端发送过来的信息,并且将这些信息存储到数据库中。

实现代码:

from socket import *
import pickle
import sqlite3
 
serverIP = '10.33.140.76'
serverPort = 8888
sockobj = socket(AF_INET, SOCK_STREAM)
sockobj.bind((serverIP, serverPort))
sockobj.listen(10)
 
conn = sqlite3.connect('endpointDatabase')
curs = conn.cursor()
tblcmd = 'create table endpointInformation(hostname char(50), hostIP char(80), CPU char(80), OSVersion char(30), Memory char(15), DiskInfo char(20),AppList char(200))'
curs.execute(tblcmd)
 
while True:
    i = 1
    connection, address = sockobj.accept()
    print('Server Connected by', address)
    clientFile = open('client'+str(i)+'.pkl','wb')
    data = connection.recv(1024)
    while data:
        clientFile.write(data)
        data = connection.recv(1024)
    clientFile.close()
    clientFile = open('client'+str(i)+'.pkl','rb')
    information = pickle.load(clientFile)
    clientFile.close()
    curs.execute('insert into endpointInformation values (?, ?, ?, ?, ?, ?, ?)', (str(information['Hostname']), str(information['CPU']), str(information['Memory']), str(information['IP']), str(information['OSversion']), str(information['Disk']), str(information['AppList'])))
    conn.commit()
    print(information)
    connection.close()
    i += 1

2)testdatabase.py

主要用途:用于测试服务器生成的数据库信息。用select语句获取数据库中的所有信息。

实现代码:

import sqlite3
 
conn = sqlite3.connect('endpointDatabase')
curs = conn.cursor()
curs.execute('select * from endpointInformation')
print(curs.fetchall())

3、将客户端程序制作成可执行程序

        1py2exe

据说这是一个非常经典的将py文件转换为exe文件的工具,但是对python 的版本限制比较严,而且有bug,不用。

        2cx_Freeze

据说这是一个比py2exe好用的转换工具,但是对版本限制也比较严,也有bug,不用。

3)pyinstaller

这就是本次所用的转换工具,应该是支持任何python版本,并且转换工作和前两者相比相当简单。

#下载安装pyinstaller:
D:\000 myDoc\08 提取用户信息\forWindows>python -m pip install --upgrade pyinstaller
#对py文件进行转换:
D:\000 myDoc\08 提取用户信息\forWindows>pyinstaller dataTransfer.py

下面的链接提供了我自己录制的视频、完整的代码、使用文档、可执行文件,有兴趣的哥们可以自己down下来研究研究:

https://yunpan.cn/cqccZYAjsjurb  访问密码 3e63

土豆网上也有我的视频哦,后续提供链接。

四、使用教程

1、服务器

要先在服务器上开启服务。

如下图所示,在服务器上只需要切换到程序所在目录,执行即可:

2、客户端(以win2008为例)

将压缩文件解压:

双击可执行文件:

客户端操作完毕。

3、现象

服务器控制台会有回显信息。

使用python脚本查询服务器数据库:


4、数据库

本次使用的sqlite3Python内置的数据库,可以用python语句直接访问,没有用户名和密码。

使用如下键值列表:

keylist = ['Hostname','CPU','Memory','IP','OSversion','Disk','AppList']

它们都是char类型,改数据库具体创建如下:

create table endpointInformation(hostname char(50), hostIP char(80), CPU char(80), OSVersion char(30), Memory char(15), DiskInfo char(20),AppList char(200))

-

下面的链接提供了我自己录制的视频、完整的代码、使用文档、可执行文件,有兴趣的哥们可以自己down下来研究研究:

https://yunpan.cn/cqccZYAjsjurb  访问密码 3e63

土豆网上也有我的视频哦,下面是链接:

http://www.tudou.com/programs/view/8d-JzM8DaxQ/

共有 人打赏支持
粉丝 2
博文 12
码字总数 5545
×
陈家栋
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: