从Python发出curl请求

问题描述 投票:0回答:2

我知道图书馆的要求,但出于不同原因我不想使用它。

所以我正在尝试使用Python中的curl通过formdata发出Post请求。

命令看起来像这样:

command = "curl --insecure POST --form file1='@path_to_file' --form file2='@path_to_file2' --form config='{"key1": {"key11": "value11", "key12": "value12"}, "key2": {"key21": "value21", "key22": "value22"}' <REST API Adress>"

因此,如果我将此代码手动复制到 Linux 终端中,它工作得很好,但是当我尝试使用 python 子进程自动化时,命令中到处都添加了反斜杠。我想这就是它总是失败的原因。代码如下所示:

p = Popen([command], cwd=<some path>, stdout=PIPE, stderr=PIPE)
process_output, process_error = p.communicate()

它只是失败并打印给我一个如下所示的命令:

command = "curl --insecure POST --form file1=\'@path_to_file\' --form file2=\'@path_to_file2\' --form config=\'{"key1": {"key11": "value11", "key12": "value12"}, "key2": {"key21": "value21", "key22": "value22"}\' <REST API Adress>"

我的意思是我明白了。这是因为单引号,但我怎样才能避免这种情况呢?就像我怎样才能在没有反斜杠的情况下真正执行正确的命令?

python linux rest curl subprocess
2个回答
1
投票

像 shell 一样将命令拆分成单词。

rest_api_address = ...
commmand = ["curl",
            "--insecure", "POST",
            "--form", "file1=@path_to_file",
            "--form", "file2=@path_to_file2",
            "--form", "config={...}",
            rest_api_address]

p = Popen(command, ...)

单引号是为了 shell 的利益;当我们像这里一样绕过 shell 时,它们不是必需的。


0
投票

我在Windows上,所以我无法测试,但我有更好的经验,以相反的方式使用引号,也许这对你也有帮助。所以在你的例子中:

command = 'curl --insecure POST --form file1="@path_to_file" --form file2="@path_to_file2" --form config="{"key1": {"key11": "value11", "key12": "value12"}, "key2": {"key21": "value21", "key22": "value22"}" <REST API Adress>'
© www.soinside.com 2019 - 2024. All rights reserved.