python模块之subprocess模块, struct模块

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python模块之subprocess模块, struct模块相关的知识,希望对你有一定的参考价值。

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.Popen(rdir C:\\Users\\Administrator\\PycharmProjects\\test\\函数备课,shell=True,stdout=subprocess.PIPE)
res=subprocess.Popen(findstr test*,shell=True,stdin=res1.stdout,
                 stdout=subprocess.PIPE)

print(res.stdout.read().decode(gbk)) #subprocess使用当前系统默认编码,得到结果为bytes类型,在windows下需要用gbk解码

 

struct


struct模块 

该模块可以把一个类型,如数字,转成固定长度的bytes

>>> struct.pack(i, 1000000000000000000)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
struct.error: argument out of range


# struct.error: ‘i‘ format requires -2147483648 <= number <= 2147483647 #这个是范围

技术分享

import json,struct
#假设通过客户端上传1T:1073741824000的文件a.txt

#为避免粘包,必须自定制报头
header={file_size:1073741824000,file_name:/a/b/c/d/e/a.txt,md5:8f6fbf8347faa4924a76856701edb0f3} #1T数据,文件路径和md5值

#为了该报头能传送,需要序列化并且转为bytes
head_bytes=bytes(json.dumps(header),encoding=utf-8) #序列化并转成bytes,用于传输

#为了让客户端知道报头的长度,用struck将报头长度这个数字转成固定长度:4个字节
head_len_bytes=struct.pack(i,len(head_bytes)) #这4个字节里只包含了一个数字,该数字是报头的长度

#客户端开始发送
conn.send(head_len_bytes) #先发报头的长度,4个bytes
conn.send(head_bytes) #再发报头的字节格式
conn.sendall(文件内容) #然后发真实内容的字节格式

#服务端开始接收
head_len_bytes=s.recv(4) #先收报头4个bytes,得到报头长度的字节格式
x=struct.unpack(i,head_len_bytes)[0] #提取报头的长度

head_bytes=s.recv(x) #按照报头长度x,收取报头的bytes格式
header=json.loads(json.dumps(header)) #提取报头

#最后根据报头的内容提取真实的数据,比如
real_data_len=s.recv(header[file_size])
s.recv(real_data_len)
技术分享
#_*_coding:utf-8_*_
#http://www.cnblogs.com/coser/archive/2011/12/17/2291160.html
__author__ = Linhaifeng
import struct
import binascii
import ctypes

values1 = (1, abc.encode(utf-8), 2.7)
values2 = (defg.encode(utf-8),101)
s1 = struct.Struct(I3sf)
s2 = struct.Struct(4sI)

print(s1.size,s2.size)
prebuffer=ctypes.create_string_buffer(s1.size+s2.size)
print(Before : ,binascii.hexlify(prebuffer))
# t=binascii.hexlify(‘asdfaf‘.encode(‘utf-8‘))
# print(t)


s1.pack_into(prebuffer,0,*values1)
s2.pack_into(prebuffer,s1.size,*values2)

print(After pack,binascii.hexlify(prebuffer))
print(s1.unpack_from(prebuffer,0))
print(s2.unpack_from(prebuffer,s1.size))

s3=struct.Struct(ii)
s3.pack_into(prebuffer,0,123,123)
print(After pack,binascii.hexlify(prebuffer))
print(s3.unpack_from(prebuffer,0))
struct详细用法

 

以上是关于python模块之subprocess模块, struct模块的主要内容,如果未能解决你的问题,请参考以下文章

python重要模块之subprocess模块

python常用模块之subprocess

python模块之subprocess

Python 之 subprocess模块

Python3之subprocess模块

Python之subprocess模块的使用