python subprocess popen_将参数传递到Python subprocess.Popen

I'm converting this bash script to Python. I have a working Python version now. However, in order to get it to work, I had to hack the command I passed to subprocess.Popen() by making it into one long string. I do not wish to use one long command string. I wish to break this into the proper individual parameters. How can I do that in this specific example?

My specific question is how do I change this line:

process = subprocess.Popen(cmd, shell=True, ...

into a form like this:

process = subprocess.Popen([prog, inf, arate, outf], shell=False, ...

Here's my complete code so that the above fragments will make sense:

#!/usr/bin/env python

import sys

import subprocess

import os.path

import argparse #requires Python 2.7 or above

parser = argparse.ArgumentParser(description='Converts (.M4V) videos into (.MP3) audio files using ffmpeg.')

parser.add_argument('-d','--directory', help='Source directory name',required=True)

parser.add_argument('-o','--output',help='Output directory name', required=False)

parser.add_argument('-a','--arate',help='ffmpeg\'s arate option', default="64K", required=False)

parser.add_argument('-s','--source',help='Input type; e.g., file ext (default .m4v)', default=".m4v", required=False)

parser.add_argument('-e','--ext',help='Output type; e.g., file ext (default .mp3)', default=".mp3", required=False)

parser.add_argument('-p','--program',help='application program e.g., /usr/bin/ffmpeg', default="/usr/bin/ffmpeg", required=False)

args = parser.parse_args()

arate = args.arate

source = args.source

new_ext = args.ext

prog = args.program

in_path = args.directory

if(not args.output):

out_path = in_path

else:

out_path = args.output

if(not os.path.isfile(prog)):

print("Command {} does not exist".format(prog))

else:

try:

filenames = os.listdir(in_path)

for file in filenames:

print("name={}\nextension={}".format(name, extension))

if(extension == source):

inf = os.path.join(in_path, file)

outf = os.path.join(out_path, name + new_ext)

cmd = "{xprog} -i '{xpath}' -b:a {art} -vn '{xout}'".format(xprog=prog, xpath=inf, art=arate, xout=outf)

process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)

stdout,stderr = process.communicate()

return_code = process.poll()

print("stdout='{}'\nstderr='{}'\nreturn_code='{}'".format(stdout, stderr, return_code))

except IOError as e:

print("Error: file not found.")

解决方案

Here is a complete working solution with proper arguments for Popen().

import subprocess

import os.path

import argparse #requires Python 2.7 or above

parser = argparse.ArgumentParser(description='Converts (.M4V) videos into (.MP3) audio files using ffmpeg.')

parser.add_argument('-d','--directory', help='Source directory name',required=True)

parser.add_argument('-o','--output',help='Output directory name', required=False)

parser.add_argument('-a','--arate',help='ffmpeg\'s arate option', default="64K", required=False)

parser.add_argument('-s','--source',help='Input type; e.g., file ext (default .m4v)', default=".m4v", required=False)

parser.add_argument('-e','--ext',help='Output type; e.g., file ext (default .mp3)', default=".mp3", required=False)

parser.add_argument('-p','--program',help='application program e.g., /usr/bin/ffmpeg', default="/usr/bin/ffmpeg", required=False)

args = parser.parse_args()

arate = args.arate

source = args.source

new_ext = args.ext

prog = args.program

in_path = args.directory

if(not args.output):

out_path = in_path

else:

out_path = args.output

if(not os.path.isfile(prog)):

print("Command {} does not exist".format(prog))

else:

try:

filenames = os.listdir(in_path)

for file in filenames:

name, extension = os.path.splitext(file)

if(extension == source):

print("Processing: {}".format(file))

inf = os.path.join(in_path, file)

outf = os.path.join(out_path, name + new_ext)

process = subprocess.Popen([prog, "-i", inf, "-b:a", arate, "-vn", outf], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)

stdout,stderr = process.communicate()

return_code = process.poll()

print("stdout='{}'\nstderr='{}'\nreturn_code='{}'".format(stdout, stderr, return_code))

else:

print("Skipping: {}".format(file))

except IOError as e:

print("Error: file not found.")

If anyone has improvements on this, please let me know!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值