我正在尝试使用 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
希望有人能帮忙!
您正在使用终端使用的控制结构来指定参数的开始和结束位置,但这在
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',
]
)
对于查询字符串,我建议使用一个工具将字典转换为查询字符串:查询字符串采用百分比编码相当复杂,而且很容易出错。