我正在将this bash script转换为Python。我现在有一个可用的Python版本。然而,为了让它起作用,我必须通过将它传递给一个长字符串来破解我传递给subprocess.Popen()的命令。 我不希望使用一个长命令字符串。我想打破这个适当的个人参数。我怎样才能在的具体例子中做到这一点?将参数传递给Python子进程.Popen
我的具体问题是我该如何改变这一行:
process = subprocess.Popen(cmd, shell=True, ...
成这样一种形式:
process = subprocess.Popen([prog, inf, arate, outf], shell=False, ...
这里是我完整的代码,因此,上述片段才有意义:
#!/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.")
谢谢,但我不想将任意命令行转换为Popen格式。这不是我的问题。我试图让上面的脚本以正确的方式工作。这是一个具体的问题,不是一般的问题。你能说明如何写上面的脚本吗?谢谢 – MountainX
我更新了我的问题,使其更清楚。谢谢 – MountainX