我有很多图像可以优化和排序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 []?
提前谢谢!
答案 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
中的fork
和C
https://docs.python.org/2/library/subprocess.html#subprocess.PIPE
答案 2 :(得分:0)
要允许inname
,outname
文件名中的空格(或其他特殊字符),请从一开始就将命令构造为列表:
cmd = ['c2d', inname]
cmd += '-clip 1% 99% -type short -stretch 1% 99% 0 255 -o'.split()
cmd += [outname]
p = subprocess.Popen(cmd)
...