gpt4 book ai didi

python - curl 工作正常,除非我用子进程调用它

转载 作者:太空狗 更新时间:2023-10-29 21:09:33 27 4
gpt4 key购买 nike

我的卷发看起来有点像这样:

curl -1 -X POST --user "xxx:yyy" -d "status=new&content=issue+details+at%3A+http%3A%2F%2Flocalhost%3A6543%2Ftest%2Fsubmit%2F16-07-03-H-20-18-&kind=bug&title=QA+Fail&responsible=xxx&priority=critical"  "https://api.bitbucket.org/1.0/repositories/my/repo/issues"

如果我打开一个终端并执行它,它工作正常(在 bitbucket 中产生了一个问题)

如果我尝试通过子进程执行相同的 curl,它就会失败:

sCmd = "curl....etc"
lCmd = [s for s in sCmd.split() if s]
subprocess.call(lCmd)

我收到错误信息:

curl: (1) Protocol "https not supported or disabled in libcurl

我不明白为什么完全相同的命令在 Python 中的工作方式如此不同。有什么想法吗?

顺便说一句,这没有使用 virtualenv。我知道 lCmd 的内容是有效的

PS:是的,我知道我应该使用请求。不幸的是 requests 给我带来了类似的问题。

最佳答案

在这种情况下,拥有 shell 的唯一意义在于将字符串拆分为一组参数。

事实是,您不需要任何东西为您做这些——您可以自己做的更准确、更一致!

subprocess.call([
'curl',
'-1',
'-X', 'POST',
'--user', 'xxx:yyy',
'-d', 'status=new&content=issue+details+at%3A+http%3A%2F%2Flocalhost%3A6543%2Ftest%2Fsubmit%2F16-07-03-H-20-18-&kind=bug&title=QA+Fail&responsible=xxx&priority=critical',
'https://api.bitbucket.org/1.0/repositories/my/repo/issues'
])

这也避免了文字引号和句法引号之间的混淆:指定文字 argv 时,您传递的文字 Python 字符串是子进程接收的文字字符串——不需要将引号传递给 shell。


这比以字符串开头并将其拆分要可靠得多,即使使用 Python 内置函数也是如此:考虑您的用户名包含空格的情况。包含

的列表
'--user', 'user name:password'

...是完全明确的,而

--user user name:password

...将错误地解析。

更糟糕的是包含 $(rm -rf $HOME) 的用户名——如果您使用 os.system()subprocess.Popen( ..., shell=True),该用户名可以作为命令执行;使用文字字符串,您就完全安全了。


那是说——具体错误,re: libcurl 没有使用 SSL 支持编译,不会是特定于调用约定的。我建议检查您的环境——如果您在 PATH 中首先有不同版本的 curl,或者在您的环境之间的 LD_LIBRARY_PATH 中有不同版本的 libcurl,这将解释所讨论的错误。

关于python - curl 工作正常,除非我用子进程调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38173230/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com