我的卷发看起来有点像这样:
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:是的,我知道我应该使用请求。不幸的是,请求给了我类似的问题。
答案 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)