我在使用Python的子进程模块时遇到一些问题

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

我正在尝试使用 Tidal API 执行某些操作,并且我想使用子进程执行此命令:

curl -X 'GET' \
  'https://openapi.tidal.com/search?query=The%20Weekend%20Anti%20Up&offset=0&limit=10&countryCode=US&popularity=WORLDWIDE' \
  -H 'accept: application/vnd.tidal.v1+json' \
  -H 'Authorization: Bearer <here is my access code and it is a few lines long> \
  -H 'Content-Type: application/vnd.tidal.v1+json'

在Python中,我尝试使用这段代码:

import subprocess

subprocess.run(["curl", "-X", "'GET'", "\\", "'https://openapi.tidal.com/search?query=The%20Weekend%20Anti%20Up&offset=0&limit=10&countryCode=US&popularity=WORLDWIDE'", "\\", "-H", "'accept: application/vnd.tidal.v1+json'", "\\", "-H", "'Authorization: Bearer <here is my acces code again>'", "\\", "-H", "'Content-Type: application/vnd.tidal.v1+json'"])

当我在终端中运行命令时,它可以工作,但是当我使用子进程执行该命令时,我得到以下输出:

curl: (3) URL rejected: Malformed input to a URL function
curl: (3) URL rejected: Port number was not a decimal number between 0 and 65535
curl: (3) URL rejected: Malformed input to a URL function
curl: (3) URL rejected: Malformed input to a URL function
curl: (3) URL rejected: Malformed input to a URL function

希望有人能帮忙!

python subprocess command
1个回答
0
投票

您正在使用终端使用的控制结构来指定参数的开始和结束位置,但这在

subprocess
中不是必需的,因为您将参数指定为字符串列表。

您可以通过两种方式执行此操作:使用

"\\"
,终端使用它来指定命令尚未完成,并且终端应该读取下一行并本质上“连接”这两行,但这里有没有新行。

第二个问题是引号的使用,在终端中,可以写入

foo 'bar qux'
来指定
bar qux
是一个参数,并以空格作为参数的 content。但引号随后会被 shell 删除。

因此您可以使用:

import subprocess

subprocess.run(
    [
        'curl',
        '-X',
        'GET',
        'https://openapi.tidal.com/search?query=The%20Weekend%20Anti%20Up&offset=0&limit=10&countryCode=US&popularity=WORLDWIDE',
        '-H',
        'accept: application/vnd.tidal.v1+json',
        '-H',
        'Authorization: Bearer <here is my acces code again>',
        '-H',
        'Content-Type: application/vnd.tidal.v1+json',
    ]
)

对于查询字符串,我建议使用一个工具将字典转换为查询字符串:查询字符串采用百分比编码相当复杂,而且很容易出错。

© www.soinside.com 2019 - 2024. All rights reserved.