Flask中subprocess.call变量%s替换报错,求正确实现方法
问题解决:subprocess.call中OpenSSL命令的变量替换与参数传递错误
错误原因
你遇到的TypeError: bufsize must be an integer,是因为错误地将变量元组(C,L,O,CN,SAN)作为subprocess.call的第二个参数传入——这个位置对应的是bufsize参数(要求整数),而非命令参数的格式化值。同时,你未对-subj和-addext字段中的%s完成实际变量替换。
正确实现方式
推荐使用列表形式构建命令(避免shell注入风险),先完成变量替换再传入:
方法1:使用f-string格式化(Python 3.6+)
import subprocess as sp # 提前格式化需要替换变量的字段 subj_content = f'/C={C}/L={L}/O={O}/CN={CN}' addext_content = f'subjectAltName = DNS:{SAN}' sp.call([ 'openssl', 'req', '-new', '-key', 'certs_out/certs/key_name.key', '-out', 'certs_out/certs/csr_name.csr', '-subj', subj_content, '-addext', addext_content ])
方法2:使用%格式化字符串
import subprocess as sp sp.call([ 'openssl', 'req', '-new', '-key', 'certs_out/certs/key_name.key', '-out', 'certs_out/certs/csr_name.csr', '-subj', '/C=%s/L=%s/O=%s/CN=%s' % (C, L, O, CN), '-addext', 'subjectAltName = DNS:%s' % SAN ])
关键说明
subprocess.call的第一个参数是完整的命令参数列表,所有需要替换变量的部分必须先处理成具体字符串,再加入列表。不能直接将格式化元组作为第二个参数传入,否则会被识别为bufsize参数,引发类型错误。
内容的提问来源于stack exchange,提问作者Alex K
相关产品推荐
相关产品推荐

