Python 具有%dict()的subprocess.Popen中的多个变量

Python 具有%dict()的subprocess.Popen中的多个变量,python,variables,awk,popen,Python,Variables,Awk,Popen,我有很多图片来优化和排序csv文件中的所有输入名称和输出名称。以前,我使用AWK来完成这类工作,但现在我更喜欢使用python和.Popen方法 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(in

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

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'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:不支持%的操作数类型:'list'和'dict'
如何将所有这些变量传递到Ponpen[]


提前谢谢你

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

argscmd%dict(inname='test1.png',outname='test1-2.png')
是一个列表,
%
不是列表和dict的定义操作。您需要将
%
的第一个操作数作为字符串。尝试以下方法:

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)
第二,您需要转义打算作为文本的
%
符号。你会想要这个:

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)

我将@Alp答案更改为:

subprocess.Popen(argscmd,shell=True,stdout=subprocess.PIPE,preexec\u fn=os.setsid)

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

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

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

自从我开始阅读Popen(),几乎每个人都说shell=True是不安全的。我现在不太愿意用它……对不起,这是错的。不要同时使用列表参数(
argscmd
)和
shell=True
。在大多数情况下,字符串参数应该与
shell=True
一起使用,而不是列表。虽然我没有看到任何迹象表明在OPs的情况下,
shell=True
是必要的。非常感谢,它工作得很好。然后我将把csv带到脚本中。@user3817800:
shlex.split()
如果
inname
outname
包含空格,则在此处中断。你可以