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

标签 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:是的,我知道我应该使用请求。不幸的是 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/

相关文章:

python - Pandas 计算一列中值的出现次数

linux - 将数据发布到表单 cURL

php - 通过从 curl_getinfo() 获取详细信息来获取 cURL 请求的时间

Php SoapClient stream_context 选项

.htaccess - 带有 .htaccess 的 HTTPS 和 REST API

java - 将 Cookie 从 Java 传递到浏览器

python dict通过键值删除重复值?

python - pandas 有没有办法将 read_sql() 与 sql 语句一起使用,该语句需要多个变量?

python - 将数组转换为百分位数

php - curl namelookup_time 为 10 秒