python实⽤【⼤技巧】之Python⼿把⼿实现远程控制桌⾯⽬前的数据⼯作中,数据科学家使⽤最多的⼯具语⾔就是Python,排在第⼆的⼯具语⾔是R语⾔。但这⾥有⼀个有趣的现象,那就是同时使⽤Python或者R语⾔的⼈,推荐别⼈使⽤Python的却远⾼于R语⾔。Why?
答案是:
1. Python简单易学,极其容易上⼿,语法简单,处理速度会⽐R语⾔要快,⽽且⽆需把数据库切割。
2. 市场前景好,是⽬前的趋势,就业也会更容易。
3. 标准库⾮常庞⼤,特别的“功能齐全”,可以处理各种⼯作,其中就包含抓取和处理数据。
Python作为⼀种应⽤极为⼴泛的语⾔,⼏乎在任何领域都能派上⽤场。想做Web有Flask / Django / Tornado;想做分布式有Celery;想做⼿机App有 Kivy ;想做数据分析有Pandas;想做可视化有Matplotlib / Seaborn / Plotly / Bokeh;想做机器学习有Tensorflow / PyTorch /
夸张⼀点说,⼏乎没有什么做不了的东西(笔芯)。⼩编今天分享⼀些可以⽤Python做的⾮常好玩的事情,⼤家都可以试试看~
1、增加⾯试通过率(据真实事件改编)
⾯试官:请实现⼀个中序表达式求值程序,⽀持四则运算和括号。⽐如输⼊'3+6/(3-2)',输出9。
同学:我什么语⾔都能⽤吗?
⾯试官:是的,但最好常⽤。
同学:那我⽤python⾏吗?
⾯试官:没问题。
同学:eval(x)。
⾯试官:(冷汗。。)同学你看看,这个程序是不是有点。。
同学:啊!不安全对吧。(⽤正则表达式加了个检查,看是不是仅含四则运算和括号的表达式)你看,我还带语法报错,除零检测,浮点精度⽀持。是不是你都被我的机智感动了!
⾯试官:(瀑布汗)额。。好吧你过了。。
引⾔本项⽬旨在让⼤家理解远控软件的原理,通过远控桌⾯可以实现远程控制我们的电脑,更好更⽅便的管理电脑。⽂末将给出初始版的完整代码,需要使⽤到的其他⼯具也会有所说明。最终实现的效
果就是只要⽤户点击了客户端的程序运⾏,我们就可以在服务端对其进⾏控制。效果如下:左边是客服端程序运⾏了,然后我们就可以在左边的另⼀台电脑上打开服务端程序进⾏控制,可以看到左边的屏幕图像也已经显⽰在了右边的电脑上。完整代码见⽂末!
01
远控流程
1.1 环境要求
本次环境使⽤的是python3.6.5+windows平台主要⽤的库有:图像处理库opencv,包括⽤来⽬标检测和图像处理等操作。Socket⽤来远程传输数据达到远程控制的效果;Threading模块⽤来创建多线程管理;Numpy模块⽤来辅助opencv对图像进⾏⼀些像素值操作;PIL模块⽤来获取屏幕图像数据;use⽤来控制⿏标点击事件。达到远程控制⿏标的作⽤。1.2 客户端讲解客户端在这⾥指的是被控制的电脑,就是我们需要受到控制的电脑。(1)⾸先是导⼊相关模块:
1#客户端代码
2import socket
3import threading
4import cv2
5import numpy as np
6from PIL import ImageGrab
use import Button,Controller
(2)接着创建⼀个⿏标控制器和⽤来接收服务端数据的函数。因为需要⼀直都接收数据,故需要嵌⼊循环。在这⾥客户端还需要接收数据的原因是,⽤来接收服务端传来的⿏标控制信息,要不然怎么实现⿏标控制桌⾯的效果呢。
1#接受服务器返回的数据的函数
2m = Controller()
3def recvlink(client):
4 while True:
5 v(1024)
6 msg=msg.decode('utf-8')
7 print(msg)
8 key = msg.split(",")
9 xp = int(key[0])
10 yp = int(key[1])
11 m.position = ((xp,yp))
12 m.click(Button.left,1)
(3)创建ipv4的socket对象,使⽤TCP协议(SOCK_STREAM)。然后设置服务端IP地址,以及端⼝。这⾥⽤来向服务端传输数据,即传输桌⾯图像数据。注释代码如下:
1#创建ipv4的socket对象,使⽤TCP协议(SOCK_STREAM)
2client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
3#设置服务器ip地址,注意应该是服务器的公⽹ip
4host='服务器的公⽹ip'
5#设置要发送到的服务器端⼝,需要在云服务器管理界⾯打开对应端⼝的防⽕墙
6port=设置的端⼝
7#建⽴TCP协议连接,这时候服务器就会监听到到连接请求,并开始等待接受client发送的数据
9#建⽴连接后,服务器端会返回连接成功消息
10start_v(1024)
11print(start_msg.decode('utf-8'))
12#开启⼀个线程⽤来接受服务器发来的消息
13t=threading.Thread(target=recvlink,args=(client,))
14t.start()
15p = ab()#获得当前屏幕
16quality = 25 # 图像的质量
17encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), quality]
18while True:
19 im = ab()
20 imm=cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR)#转为opencv的BGR格式
21 imm = size(imm, (1535, 863))
22 img_encode = cv2.imencode(".jpg", imm, encode_param)[1]
23 data_encode = np.array(img_encode)
24 str_encode = string()
25 #print(len(str_encode))
26 #输⼊要发送的信息
27 sendmsg="kehu"
28 #向服务器发送消息
29 client.send(str_encode)
30 if sendmsg=='quit':
31 break
32#结束时关闭客户端
33client.close()
1.3 服务端讲解服务端指的是⽤来控制远程电脑的那⼀端,为了⽅便使⽤,我们直接在服务器上使⽤即可。(1)导⼊使⽤到的模块:
2import socket
3import threading
4import numpy as np
5import cv2
6import os
(2)创建⿏标点击事件函数,⽤来获取⿏标点击的位置坐标:
1print("等待连接---")
2def mouse_click(event, x, y, flags, para):
3 if event == cv2.EVENT_LBUTTONDOWN: # 左边⿏标点击
4 f=open("1.txt","w")
5 f.write(str(x)+","+str(y))
6 f.close()
(3)创建服务器端接收数据函数,⽤来实时接收传输过来的图像数据并显⽰:
1def recv_msg(clientsocket):
2 while True:
3 # 接受客户端消息,设置⼀次最多接受10240字节的数据
4 recv_msg = v(102400)
5 # 把接收到的东西解码
6 msg = np.fromstring(recv_msg, np.uint8)
7 img_decode = cv2.imdecode(msg, cv2.IMREAD_COLOR)
8 try:
9 s=img_decode.shape
10 img_decode=img_decode
11 temp=img_decode
12 except:
13 img_decode=temp
14 pass
15 cv2.imshow('SERVER', img_decode)
16 cv2.setMouseCallback("SERVER", mouse_click)
17 try:
18 f=open("1.txt")
19 ad()
20 f.close()
21 reply=txt
22 print(reply)
23 clientsocket.de('utf-8'))
24 os.remove("1.txt")
25 except:
26 pass
27 if cv2.waitKey(1) & 0xFF == ord('q'):
28 break
(4)主函数,⽤来建⽴连接和数据接收等功能。
2 socket_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
3 host='服务器的本地ip'
4 #设置被监听的端⼝号,⼩于1024的端⼝号不能使⽤
5 port=设置的端⼝
6 socket_server.bind((host,port))
7 #设置最⼤监听数,也就是最多可以同时响应⼏个客户端请求,⼀般配合多线程使⽤
8 socket_server.listen(5)
9 #等待客户端连接,⼀旦有了连接就⽴刻向下执⾏,否则等待
10 #accept()函数会返回⼀个元组,第⼀个元素是客户端socket对象,第⼆个元素是客户端地址(ip地址+端⼝号)
11 clientsocket,addr=socket_server.accept()
12 # 有了客户端连接后之后才能执⾏以下代码,我们先向客户端发送连接成功消息
13 clientsocket.send('连接成功'.encode('utf-8'))
14 # 和客户端⼀样开启⼀个线程接受客户端的信息
15 t=threading.Thread(target=recv_msg,args=(clientsocket,))
16 t.start()
02
远程控制GUI窗⼝
远控桌⾯GUI主要是为了美观⽽⽤,需要⼤家根据远程代码进⾏集合修改。当然单独使⽤上述代码已经可以实现功能了,只是不够美观。由于考虑到此处代码量较⼤,且不是重点,故粗略讲解(1)导⼊相关库:
1from PyQt5.QtWidgets import *
2from PyQt5.QtCore import *
python怎么读取桌面上的文件3from PyQt5.QtGui import QPalette, QBrush, QPixmap
4import os
5import socket
6import threading
7import cv2
8import numpy as np
9from PIL import ImageGrab
use import Button,Controller
11import time
(2)建⽴⿏标控制函数和点击函数
1m = Controller()
2def mouse_click(event, x, y, flags, para):
3 if event == cv2.EVENT_LBUTTONDOWN: # 左边⿏标点击
4 print( x, y)
5 m.position = (x, y)
6 time.sleep(0.1)
7 m.click(Button.left, 1)
(3)GUI界⾯初始化,由于我们需要把实时的视频显⽰在窗⼝上,故也需要使⽤到opencv。
1def __init__(self, parent=None):
2 super(Ui_MainWindow, self).__init__(parent)
3 # self.face_recong = face.Recognition()
4 self.timer_camera = QtCore.QTimer()
5 self.cap = cv2.VideoCapture()
6 self.CAM_NUM = 0
7 self.set_ui()
8 self.slot_init()
9 self.__flag_work = 0
10 self.x = 0
11 unt = 0
(4)设置窗⼝⼤⼩和控件位置等信息。创建布局和设置名称
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论