subprocess的popen命令参数无法工作。
subprocess的popen命令参数无法工作。
我一直在尝试通过命令行传递一个只能使用双引号的命令给ffmpeg的\"concat:file1|file2\"
参数。然而,我无法通过subprocess.Popen()
在Python中实现这个。有人知道如何将引号传递给subprocess.Popen吗?\n以下是代码:\n
command = "ffmpeg -i "concat:1.ts|2.ts" -vcodec copy -acodec copy temp.mp4" output,error = subprocess.Popen(command, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
\n当我这样做时,ffmpeg只接受引号包围的concat片段。有没有办法成功地将这行传递给subprocess.Popen命令?
subprocess模块是Python中用来执行外部命令的一个模块,其中常用的方法包括Popen方法。在该问题中,出现了subprocess.Popen方法的命令行参数无法正常工作的问题。下面将分析问题的原因以及解决方法。
问题原因:
问题出现在旧版本的Python中,而在Python 2.7.3版本中已经修复了这个问题。具体来说,问题在于命令将stderr(标准错误输出)重定向到stdout(标准输出),在旧版本的Python中,这个命令的写法是不正确的。
解决方法:
为了解决这个问题,需要将命令的写法修改为在Python 2.7.3及更高版本中适用的写法。具体来说,需要将stderr的参数改为subprocess.STDOUT,表示将stderr重定向到stdout。这样就可以使命令正常工作。
下面是修改后的代码:
#!/usr/bin/python import subprocess command = 'php -r "echo gethostname();"' p = subprocess.Popen(command, universal_newlines=True, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) text = p.stdout.read() retcode = p.wait() print text
使用以上修改后的代码,问题得以解决。在运行test.py文件时,命令将正确地将主机名打印出来。
需要注意的是,如果遇到类似的问题,可以参考subprocess模块的官方文档,链接为:http://docs.python.org/2/library/subprocess.html。在这里可以找到更多关于subprocess模块的详细信息,以及对应版本的用法和注意事项。
问题出现的原因是在使用subprocess的Popen函数时,传递给它的命令参数不起作用。出现这个问题的原因是在传递命令参数时,双引号没有被正确地转义或者被自动转义了。解决这个问题的方法是要么使用单引号将整个模式括起来以自动转义双引号,要么显式地转义双引号。这个问题与Popen本身无关。
记录一下,我遇到了一个特别的问题,即将基于列表的命令传递给Popen时,在Windows下无法正确地保留双引号,该双引号用于括起一个glob模式(即在接受的答案中建议的内容)。在将列表连接成一个字符串后,再将其传递给Popen函数,问题得到了解决。
这是对我有用的答案。我必须使用subprocess.run(" ".join(cmd), shell=True)
来解决这个问题。其他方法都不起作用。
我在使用python请求用户输入代理密码时,也使用了类似的方法将非代理主机(-N
)传递给JMeter "*.local|localhost"
。
问题描述:subprocess popen命令参数不起作用。
问题原因:使用引号字符串形式的命令参数时,需要注意处理引号的方式。在Unix系统中,如果要传递一个字符串,需要使用shell=True
参数。否则,Python会在路径中查找一个叫做ffmpeg -i "concat....
的程序,而实际上这个程序不存在。
解决方法:建议使用列表形式的命令参数,而不是引号字符串形式。这样可以更准确地表示要传递给最终进程的参数集,并且不需要处理引号。如果非要使用引号字符串形式,可以使用不同的引号,并添加shell=True
参数。
以下是示例代码:
command = ["ffmpeg", "-i", "concat:1.ts|2.ts", "-vcodec", "copy", "-acodec", "copy", "temp.mp4"] output,error = subprocess.Popen( command, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
或者:
command = 'ffmpeg -i "concat:1.ts|2.ts" -vcodec copy -acodec copy temp.mp4' output,error = subprocess.Popen( command, universal_newlines=True, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
对于需要同时使用两种引号的情况,可以使用三引号的Python字符串字面量:cmd = r"""cmd "concat:1.ts|2.ts" $'\t' ..."""
在现代Python中,可以尽量避免使用Popen
,而是使用subprocess.check_call
,这样可以避免使用communicate()
方法。