使用python subprocess / sh作为bash包装器的问题

时间:2012-11-29 03:12:09

标签: python bash subprocess

我正在尝试执行以下代码行:

subprocess.call(["java", "-cp", "/home/me/somepath/file.jar", ..., "-someflag somevalue"])

代码失败,我正在尝试运行的jar为我提供了使用信息。但是,如果我将字符串展开并将其粘贴到终端中,它就可以工作(我知道我正在正确地扩展字符串,因为sh模块在出错时会将其吐回给我)。所以这是子进程或sh运行的问题。

以下是您应该如何使用它的示例:

subprocess.call(["ls", "-l"])

以下是描述:

subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
  

所有调用都需要args,并且应该是字符串或序列   程序参数。通常提供一系列论证   首选,因为它允许模块处理任何所需的   转义和引用参数(例如,允许文件中的空格   名)。如果传递单个字符串,则任何一个shell都必须为True(请参阅   或者字符串必须简单地命名要执行的程序   没有指定任何参数。

http://docs.python.org/2/library/subprocess.html

我不清楚我是否应该在不同的地方用标志和值分解列表中的字符串。

2 个答案:

答案 0 :(得分:3)

subprocess.call(["java", "-cp", "/home/me/somepath/file.jar", ..., "-someflag", "somevalue"])

您的原始代码对应

java -cp /home/me/somepath/file.jar ... "-someflag somevalue"

在shell中。

答案 1 :(得分:0)

shell标志切换为true

subprocess.check_call(["java", "-cp", cp_arg, ..., "-someflag somevalue"], shell=True)

另外,提示,您可以使用split()函数拆分字符串命令:

subprocess.check_call("java -cp blah blah".split(), shell=True)