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

时间:2016-07-03 18:46:24

标签: python curl https

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

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:是的,我知道我应该使用请求。不幸的是,请求给了我类似的问题。

3 个答案:

答案 0 :(得分:1)

我无法回答有关在AuditReader中使用curl命令的问题,但如果您只是致电subprocess,可能会有效:

os.system

这很有可能知道import os os.system ("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\"") 直接通过终端运行。

  

这可能有助于解决有关curl未在子流程中运行的问题(可能与子流程的环境有所不同,然后与curl配置的环境有所不同):https://curl.haxx.se/docs/faq.html#curl_1_SSL_is_disabled_https

答案 1 :(得分:1)

在这种情况下,拥有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字符串是子进程接收的文字字符串 - 不需要将引号传递给外壳

这比使用字符串并拆分它更可靠,即使使用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,则可以解释相关错误。

答案 2 :(得分:0)

如果这有用,请提请Andrae的回答,它让我走上了正确的道路。

查看错误消息:

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

请注意"https是问题,另一方面https工作正常。

问题是我认为我应该用引号将我的参数字符串括起来。

所以有两种简单的方法来解决这个问题:

lCmd = shlex.split(sCmd)
subprocess.call(lCmd) 

import os
os.system(sCmd)