Python执行含%的git命令遇TypeError,求解决方案
问题修复方案
错误原因
你遇到的TypeError是因为Python旧式%字符串格式化语法中,%H会被识别为需要传入参数的占位符,但你只提供了branch这一个参数,参数数量不匹配导致报错。之前转义%未成功,是因为没使用Python%格式化的正确转义规则——需要用%%来表示一个字面量的%。
修复方法
方法1:转义%为%%
直接把命令里的%H改成%%H,让Python将其解析为单个%,而非格式化占位符:
def get_local_commits(): """Get local commits """ branch = "master" cmd = "git log origin/%s..HEAD --format=format:\"%%H\" "%(branch) output,error = runCmd2(cmd) return output,error
方法2:使用f-string(推荐,Python3.6+)
f-string是更简洁直观的字符串格式化方式,其中的%无需转义,直接书写即可:
def get_local_commits(): """Get local commits """ branch = "master" cmd = f"git log origin/{branch}..HEAD --format=format:\"%H\" " output,error = runCmd2(cmd) return output,error
方法3:使用str.format()
如果需要兼容更早Python版本,可使用str.format()方法,同样无需转义%:
def get_local_commits(): """Get local commits """ branch = "master" cmd = "git log origin/{0}..HEAD --format=format:\"%H\" ".format(branch) output,error = runCmd2(cmd) return output,error
额外安全优化建议
你的runCmd2函数使用shell=True存在潜在安全风险(若branch变量来自不可信输入),更安全的做法是将命令拆分为列表形式,不启用shell=True:
def runCmd2(cmd_args): logger.info("Running command %s" % " ".join(cmd_args)) proc = Popen(cmd_args, universal_newlines=True, stdout=PIPE, stderr=PIPE) (output, error) = proc.communicate() return output.strip(), error.strip() def get_local_commits(): """Get local commits """ branch = "master" cmd_args = ["git", "log", f"origin/{branch}..HEAD", "--format=format:%H"] output, error = runCmd2(cmd_args) return output, error
这种方式无需处理引号和转义,还能避免shell注入风险。
内容的提问来源于stack exchange,提问作者user3508811
相关产品推荐
相关产品推荐

