python 调用command line的两种方式
background:在deepfake detection 比赛中需要对视频是否篡改进行辨别,在此之前需要进行数据预处理,对视频处理有
- 可以通过moviepy直接对视频整体进行处理
- 可以通过ffmpeg对视频进行frame拆解,拆解出来的可以cv2进行图片的处理。
- 可以通过ffmpeg的其他指令(需要借助terminal 进行运行的指令对视频进行处理。因为python的ffmpeg中并没有对应的封装好的可以实现终端中对应的库函数所可以使用的方法,所以
利用os中的popen方法
在os包中,有popen3、popen等方法,利用popen()调用命令行语句
os.popen(cmd,mode,buffer)
# cmd 为要执行的指令 ,
# mode 为模式,有"r","w"模式
# buffer 为缓冲,需要缓冲为1,不需要缓冲为0
利用subprocess子进程去执行指令
subprocess.Popen(
args,
bufsize=0,
executable=None,
stdin=None,
stdout=None,
stderr=None,
preexec_fn=None,
close_fds=False,
shell=False,
cwd=None,
env=None,
universal_newlines=False,
startupinfo=None,
creationflags=0
)
这个函数类似网络模型构建中的那种函数,参数很多,但是在一般调用的过程中必要的参数args是要调用的指令的字串,shell=True
import subprocess
p = subprocess.Popen('open /Users/aczy156',shell=True)
print(p.pid)
关于subprocess的子进程问题:
利用subprocess相当于开了一个子进程,可以通过print(p.pid)
来看该子进程的属性。
如果执行该子进程是持续进行的进程 例如
cmd = "ffplay /users/aczy156/----.mp4"
subprocess.Popen(cmd,shell=True)
由于子进程是一个持续的过程,需要等待该子进程执行
p = subprocess.Popen(cmd,shell=True)
p.wait()
如果子进程是不是持续进行,即执行即完成,则无需让子进程等待,直接执行Popen即可。