2016-09-26 70 views
0

我试图创建一个基本函数,该函数将call()subprocess模块传递给程序的文件名和参数。文件名和参数是变量。当我使用call()时,它接受变量,但被调用程序读取包含"的字符串。将变量用作Python 2.7.x中子进程调用的命令的参数

这里是有问题的代码:

from subprocess import call 

def mednafen(): 
    print "Loading "+romname+"..." 
     call(["mednafen", args, romname]) 
     print "Mednafen closed." 
romname="kirby.zip" 
args="-fs 1" 
mednafen() 

我预计这将执行

mednafen -fs 1 kirby.zip 

而是它似乎解释变量的字符串作为本:

mednafen "-fs 1" "kirby.zip" 

由于这个,mednafen无法运行,因为它无法解析以开头的参数。 如果我使用shell=True,它的工作方式与预期的一样,但该功能显然非常不鼓励,因为它很容易被利用?

call("mednafen "+ args +" "+romname+"; exit", shell=True) 

有没有办法做到这一点不使用shell=True格式?

+1

尝试用str替换参数(args) – XZ6H

+0

谢谢,我给了它一个去,但它似乎没有任何效果。 call()仍然用引号解释变量。 –

+0

你的代码实际上并没有传入参数,但我想我们可以猜出你的意思。 – tripleee

回答

1

EDIT:由Jonas Wielicki建议的解决方案是使通常会用空格壳语法来分离被列为一个单独的项目确定每一个串;那样call()会正确读取它们。 shlex是不必要的。

args = ["-fs", "1"] 
call(['mednafen']+args+[rom]) 

我的初始(以下简明)溶液: shlex.split()取变量/串我喂它并将其转换成字符串文字的列表,这又导致了称为命令正确解析它们,而不是将变量解释为引号内的字符串。 所以,而不是像"-fs 0"对待的论点,我得到-fs 0像我最初想要的。

import shlex 
call(shlex.split("mednafen "+args+" "+romname)) 
+0

在这种情况下,shlex.split可以工作,但如果您可以立即将自己的参数作为正确的列表(''[“-fs”,“1”]''),那么您应该这样做,而不是使用shlex.split ,它有许多功能,可能会惊喜(处理报价等)。通过子进程,Python为您提供了一个很好的工具,可以避免空格和引用的所有缺陷,只需将python字符串*正确*作为一个参数。使用这种力量。 –

+0

这非常有帮助!非常感谢。这真的清除了subprocess如何处理程序/参数。 –

1

嗯,是的。这正是文档所说的。创建并传递包含命令和所有参数的列表。

+0

的确,使'args'成为一个列表,而'call(['mednafen'] + args + [romname])' – tripleee

+0

这给了我相同的结果。 'call()'用包含的引号解析'args'的内容。 –

+0

这是因为你忘了把它变成一个列表而不是所有参数的字符串。 –

相关问题