使用QProcess调用GitHub REST API创建Issue时遇凭证错误
解决QProcess执行curl命令返回"Bad credentials"的问题
看起来问题出在QProcess传递命令参数的方式和shell解析逻辑不一致。命令行里的curl能正常工作,是因为shell帮你处理了引号和参数分割,但QProcess默认不会通过shell执行,直接传递的参数会被原样解析,导致认证信息出错。下面是几种可行的解决办法:
方法1:拆分curl命令为独立参数列表(推荐)
PyQt4的QProcess执行外部命令时,最佳实践是将程序和每个参数分开传递,避免shell解析带来的问题。把你的curl命令拆成如下参数列表:
from PyQt4.QtCore import QProcess process = QProcess() # 拆分每个参数,注意不要加引号 args = [ "-u", "marcusbritanicus:pass", "https://api.github.com/repos/marcusbritanicus/apitrial/issues", "-XPOST", "-H", "Content-Type: application/json", "-d@issue.json" ] process.start("curl", args) process.waitForFinished() # 查看输出 print(process.readAllStandardOutput().data()) print(process.readAllStandardError().data())
这样传递的话,-u和你的凭证会被curl正确识别,不会把引号当成凭证的一部分,也就避免了"Bad credentials"错误。
方法2:通过shell执行完整命令
如果你确实需要依赖shell的特性(比如解析@issue.json的文件读取),可以让QProcess通过shell执行整个命令。注意要把命令作为一个完整字符串传递,并且处理好引号转义:
from PyQt4.QtCore import QProcess process = QProcess() # 用/bin/sh -c 包裹整个命令,注意内部引号转义 cmd = '''curl -u "marcusbritanicus:pass" https://api.github.com/repos/marcusbritanicus/apitrial/issues -XPOST -H 'Content-Type: application/json' -d@issue.json''' process.start("/bin/sh", ["-c", cmd]) process.waitForFinished() # 查看输出 print(process.readAllStandardOutput().data()) print(process.readAllStandardError().data())
不过这种方式要注意:如果你的密码包含特殊字符(比如!、$),shell会解析这些字符,导致凭证失效,这时候推荐用方法1,或者对密码进行转义。
额外排查点
- 检查QProcess的工作目录:如果
issue.json不是绝对路径,QProcess的工作目录可能和你命令行的工作目录不同,导致找不到文件(不过这个会返回"Could not read file"之类的错误,但还是建议确认一下,可以用process.setWorkingDirectory("/path/to/your/json/file")设置工作目录)。 - 避免硬编码密码:虽然这不是当前问题的原因,但硬编码密码到代码里不安全,建议用环境变量或者配置文件读取凭证。
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

