subprocess.check_output调用出现Invalid Syntax语法错误问题求助
错误原因分析
- Python内核版本不支持f-string语法:f-string是Python 3.6版本新增的特性,Colab环境默认搭载高版本Python可正常运行,若本地Jupyter Notebook使用的Python内核版本低于3.6,会直接抛出f-string相关的语法错误。
- 代码结构语法错误:你贴出的参数代码存在非法赋值问题,command定义末尾的括号后多了一个逗号,且下一行直接写
message='Data files downloaded.\n',如果这段代码没有包裹在call_bash函数的入参括号内,属于非法的Python语法,会触发语法报错。
排查解决步骤
- 首先确认Jupyter的Python内核版本,在Notebook中运行如下代码查看版本:
import sys print(sys.version)
如果版本号低于3.6,有两种解决方式:
- 升级Jupyter对应的Python环境到3.6及以上版本
- 将所有f-string替换为兼容低版本的
str.format()写法,例如将f"'{self.script_dir + 'data.sh'}' "替换为"'{}' ".format(self.script_dir + 'data.sh'),其余f-string按照相同规则替换即可。
- 修正代码结构问题:
如果是单独给command和message两个变量赋值,需要删除command赋值语句末尾的逗号,分开两行写:
command = ( f"'{self.script_dir + 'data.sh'}' " f"-D '{self.data_dir}' " f"-T '{self.tfds_dir}' " f"-R '{self.records_dir}' " f"-j {data_url} " f"-a {annotations_url} " f"-m {detections_url} " f"-I '{self.params['img_dir']}' " f"-r {self.params['use_records']} " f"-d {self.params['dataset']} " f"-i {self.params['download_images']} " ) message='Data files downloaded.\n'
如果这两个参数是直接传给call_bash函数的入参,需要把整体包裹在函数调用的括号内:
call_bash( command = ( f"'{self.script_dir + 'data.sh'}' " f"-D '{self.data_dir}' " f"-T '{self.tfds_dir}' " f"-R '{self.records_dir}' " f"-j {data_url} " f"-a {annotations_url} " f"-m {detections_url} " f"-I '{self.params['img_dir']}' " f"-r {self.params['use_records']} " f"-d {self.params['dataset']} " f"-i {self.params['download_images']} " ), message='Data files downloaded.\n' )
- 额外优化:你当前使用
shell=True参数调用subprocess.check_output,传入字符串格式的命令即可,不需要把command包装为元组,直接拼接成完整字符串可以避免不必要的参数解析异常。
内容的提问来源于stack exchange,提问作者zainul muttaqin
相关产品推荐
相关产品推荐

