subprocess.Popen中的多变量与%dict()

时间:2014-07-11 14:08:21

标签: python variables awk popen

我有很多图像可以优化和排序csv文件中的所有输入名称和输出名称。以前,我使用AWK来完成这类工作,但现在我更喜欢用.Popen方法切换到python。

import subprocess
import shlex
cmdc2d='c2d %(inname)s -clip 1% 99% -type short -stretch 1% 99% 0 255 -o %(outname)s'
argscmd=shlex.split(cmdc2d)
subprocess.Popen(argscmd%dict(inname='test1.png',outname='test1-2.png'))

输出给了我一个错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for %: 'list' and 'dict'

我怎样才能将所有这些变量传递给Ponpen []?

提前谢谢!

3 个答案:

答案 0 :(得分:0)

你有两个问题。首先,您需要在拆分字符串之前执行插值。因为在插值之前拆分命令字符串,所以

中的第一个操作数为%
argscmd%dict(inname='test1.png',outname='test1-2.png')

是一个列表,%不是列表和字典的已定义操作。您需要将%的第一个操作数作为字符串。尝试类似:

import subprocess
import shlex
cmdc2d='c2d %(inname)s -clip 1% 99% -type short -stretch 1% 99% 0 255 -o %(outname)s'
argscmd=shlex.split(cmdc2d % dict(inname='test1.png',outname='test1-2.png'))
subprocess.Popen(argscmd)

其次,您需要转义旨在成为文字%的{​​{1}}符号。你会想要这个:

%

答案 1 :(得分:0)

我会将@Alp的答案改为:

subprocess.Popen(argscmd, shell=True, stdout=subprocess.PIPE, preexec_fn=os.setsid)

这将允许您关闭Popen并读取输入。 os.setsid更像exec中的forkC

https://docs.python.org/2/library/subprocess.html#subprocess.PIPE

https://docs.python.org/2/library/os.html#os.setsid

答案 2 :(得分:0)

要允许innameoutname文件名中的空格(或其他特殊字符),请从一开始就将命令构造为列表:

cmd = ['c2d', inname]
cmd += '-clip 1% 99% -type short -stretch 1% 99% 0 255 -o'.split()
cmd += [outname]
p = subprocess.Popen(cmd)
...