在子进程命令中传递带双引号的参数

3 投票
3 回答
6994 浏览
提问于 2025-04-17 21:06

我在用 subprocess.check_output() 方法来在 Python 脚本中执行命令。有些命令在语法中需要用到 "(双引号)。

这里有一个例子:

> drozer console connect -c "run app.package.info -a com.package.name"

如果我们把上面命令中的 "(双引号)去掉,就会报错。

我做了以下操作:

string = '\"run app.package.info -a com.package.name\"'
command = ['/usr/bin/drozer','console','connect','-c',string]
output = subprocess.check_output(command)

这让我遇到了错误:

*** Unknown syntax: "run app.package.info  -a com.package.name"

我该如何解决这个关于引号的问题呢?

3 个回答

-1

你可以试着使用这个选项 shell=True,像这样:

output = subprocess.check_output(command, shell=True)
2

要解决你的问题,你需要一个可以理解 subprocess 命令参数要求的分割方法。可以使用 shlex,像这样:

>>> import shlex
>>> import subprocess
>>> 
>>> command = 'drozer console connect -c "run app.package.info -a com.package.name"'
>>> command = shlex.split(command)
>>> command
['drozer', 'console', 'connect', '-c', 'run app.package.info -a com.package.name']
>>> output = subprocess.check_output(command)
9

你不需要使用双引号。

在使用命令行时,需要双引号的原因是,命令行会把输入的内容当作一个字符串来解析,它用双引号来表示文本 run app.package.info -a com.package.name 应该作为一个整体的参数来处理:

#!/usr/bin/env python
import subprocess

c_arg = 'run app.package.info -a com.package.name'
command = ['/usr/bin/drozer', 'console', 'connect', '-c', c_arg]
output = subprocess.check_output(command)
print("Got %r" % (output,))

但是当你用代码来启动一个进程时,你是明确地指定每一个参数的,这时候就不需要命令行的解析,所以也就不需要额外的引号了。

撰写回答