subprocess

socket套接字的学习与简单应用

a 夏天 提交于 2020-03-01 10:46:26
socket套接字 Socket又称为套接字,它是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口提高了效率 socket就是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。也 为什么存在socket抽象层? 如果直接与操作系统数据交互非常麻烦,繁琐,socket对这些繁琐的的操作高度的封装,简化. socket在python中就是一个模块. 基于文件类型的套接字家族 套接字家族的名字:AF_UNIX unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信 基于网络类型的套接字家族 套接字家族的名字:AF_INET (还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET) tcp链接+循环 通信 服务端常驻 server端 import socket phone=socket.socket()#买手机 phone.bind(('127.0.0.1',6666))#绑卡 phone.listen(5)

粘包的原理与解决

徘徊边缘 提交于 2020-03-01 10:45:37
粘包现象 须知:只有TCP有粘包现象,UDP永远不会粘包 粘包不一定会发生 如果发生了:1.可能是在客户端已经粘了       2.客户端没有粘,可能是在服务端粘了 所谓粘包问题主要还是因为接收方不知道消息之间的界限 还有系统缓存区的问题 时间差的原因,不知道一次性提取多少字节的数据所造成的。 socket收发消息的原理 什么是缓冲区 输入输出缓冲区的默认大小一般都是 8K,可以通过 getsockopt() 函数获取:1024字节=1k 缓冲区的作用? 存储少量数据 如果你的网络出现短暂的异常或者波动,接收数据就会出现短暂的中断,影响你的下载或者上传的效率. 但是 凡是都是双刃剑,缓冲区解决了上传下载的传输效率的问题,带来了黏包问题. 为什么出现粘包? 第一种.连续短暂的send多次(数据量很少),你的数据会统一发送出去, (不可控) 第二种: send的数据过大,大于对方recv的上限时,对方第2次recv时,会接收上一次没有recv完的剩余的 1,接收方没有及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)** recv会产生黏包(如果recv接受的数据量(1024)小于发送的数据量,第一次只能接收规定的数据量1024,第二次接收剩余的数据量) 2,发送端需要等缓冲区满才发送出去

python模块之subprocess模块, struct模块

China☆狼群 提交于 2020-02-29 15:04:13
subprocess import subprocess ''' sh-3.2# ls /Users/egon/Desktop |grep txt$ mysql.txt tt.txt 事物.txt ''' res1=subprocess.Popen('ls /Users/jieli/Desktop',shell=True,stdout=subprocess.PIPE) res=subprocess.Popen('grep txt$',shell=True,stdin=res1.stdout, stdout=subprocess.PIPE) print(res.stdout.read().decode('utf-8')) #等同于上面,但是上面的优势在于,一个数据流可以和另外一个数据流交互,可以通过爬虫得到结果然后交给grep res1=subprocess.Popen('ls /Users/jieli/Desktop |grep txt$',shell=True,stdout=subprocess.PIPE) print(res1.stdout.read().decode('utf-8')) #windows下: # dir | findstr 'test*' # dir | findstr 'txt$' import subprocess res1=subprocess

struct 模块 & subprocess 模块

ⅰ亾dé卋堺 提交于 2020-02-29 14:30:27
struct 模块:   就这么用 >>> import struct # 首先导入此模块 res = 'ncjewgfjsdbvdhj' # 随意的值 print(len(res)) # 15 只是为了展示原res的长度 res1= struct.pack('i', len(res)) # 打包,固定i模式,len(res) print(len(res1)) # 4 i 模式下都为4, q模式都为 8 res2 = struct.unpack('i', res1)[0] # 解包,后面一定要加索引[0] print(res2) subprocess 模块:   介个这么用 >>> import subprocess # 导入模块# 此模块可以自动将你输入的命令道终端中执行,并返回执行后的结果 cmd = input('>>> ').strip() obj = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 固定写法,第一个参数为输入的命令 res = obj.stdout.read() # 结果为bytes类型 res1 = obj.stderr.read() # 结果为bytes类型print(res, res1) 来源: https://www

python中的进程、线程(threading、multiprocessing、Queue、subprocess)

末鹿安然 提交于 2020-02-28 01:12:36
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然。你做到了你就比别人NB。 我们先了解一下什么是进程和线程。 进程与线程的历史 我们都知道计算机是由硬件和软件组成的。硬件中的CPU是计算机的核心,它承担计算机的所有任务。 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配、任务的调度。 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等。 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了保证其独立性,就需要一个专门的管理和控制执行程序的数据结构——进程控制块。 进程就是一个程序在一个数据集上的一次动态执行过程。 进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。 在早期的操作系统里,计算机只有一个核心,进程执行程序的最小单位,任务调度采用时间片轮转的抢占式方式进行进程调度。每个进程都有各自的一块独立的内存,保证进程彼此间的内存地址空间的隔离。 随着计算机技术的发展,进程出现了很多弊端,一是进程的创建、撤销和切换的开销比较大,二是由于对称多处理机(对称多处理机

【Python】 子进程创建与使用subprocess

余生长醉 提交于 2020-02-27 17:16:09
subprocess *****本文参考了Vamei大神的http://www.cnblogs.com/vamei/archive/2012/09/23/2698014.html    运用subprocess包可以在运行python的进程下进一步开启一个子进程,创建子进程要注意     1. 父进程是否暂停     2.创建出的子进程返回了什么     3.执行出错,即返回的code不是0的时候应该如何处理   subprocess包提供了三个开启子进程的方法,subprocess.call() , subprocess.check_call() , subprocess.check_output(),给三者传递命令字符串作为参数。可以用(['ping','www.baidu.com','-c','3'])这种列表的形式,同时也可以是("ping www.baidu.com -c 3") 这种形式。在开启子进程的时候,可以加上shell=True的参数来让python开启一个shell,通过shell来解释获得的命令。 一般在windows下运行的程序最好都把shell=True加上,这样才能顺利地执行dos命令,但是linux下似乎不加也没啥关系。因为linux下未指明用shell执行的话会调用/bin/sh来执行,问题不大,但是dos下系统不会默认用cmd.exe来执行命令

python 执行shell命令

跟風遠走 提交于 2020-02-27 15:58:56
def shell_cmd(cmd): print('$ ' + cmd) p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) stdout, stderr = p.communicate() return p.returncode, stdout, stderr 来源: oschina 链接: https://my.oschina.net/redhands/blog/3157551

append subprocess.Popen output to file?

ε祈祈猫儿з 提交于 2020-02-27 14:11:25
问题 I can successfully redirect my output to a file, however this appears to overwrite the file's existing data: import subprocess outfile = open('test','w') #same with "w" or "a" as opening mode outfile.write('Hello') subprocess.Popen('ls',stdout=outfile) will remove the 'Hello' line from the file. I guess a workaround is to store the output elsewhere as a string or something (it won't be too long), and append this manually with outfile.write(thestring) - but I was wondering if I am missing

subprocess模块

纵饮孤独 提交于 2020-02-26 04:54:58
原始地址 subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码。这个模块的目的在于替换几个旧的模块和方法,如: os.system os.spawn* subprocess模块中的常用函数 函数 描述 subprocess.run() Python 3.5中新增的函数。执行指定的命令,等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例。 subprocess.call() 执行指定的命令,返回命令执行状态,其功能类似于os.system(cmd)。 subprocess.check_call() Python 2.5中新增的函数。 执行指定的命令,如果执行成功则返回状态码,否则抛出异常。其功能等价于subprocess.run(..., check=True)。 subprocess.check_output() Python 2.7中新增的的函数。执行指定的命令,如果执行状态码为0则返回命令执行结果,否则抛出异常。 subprocess.getoutput(cmd) 接收字符串格式的命令,执行命令并返回执行结果,其功能类似于os.popen(cmd).read()和commands.getoutput(cmd)。 subprocess

Python - subprocess.Popen - ssh -t user@host 'service --status-all'

时间秒杀一切 提交于 2020-02-24 20:57:58
问题 I've read a bunch of examples but none of them work for this specific task. Python code: x = Popen(commands, stdout=PIPE, stderr=PIPE, shell=True) print commands stdout = x.stdout.read() stderr = x.stderr.read() print stdout, stderr return stdout Output: [user@host]$ python helpers.py ['ssh', '-t', 'user@host', ' ', "'service --status-all'"] usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-e escape_char] [-F configfile] [-I pkcs11] [-i