使用subprocess.run()调用PyLint --init-hook失效,疑转义问题
解决subprocess.run调用pylint时--init-hook失效的问题
问题根源在于你给--init-hook参数额外添加了引号和转义字符。使用subprocess.run的列表模式传参时,不需要像bash Shell那样用引号包裹参数内容——列表本身已经完成了参数的分割,额外的引号会被pylint当成init-hook代码的一部分,导致路径解析错误,最终触发导入问题。
正确的写法
直接传递不带额外引号的init-hook代码即可:
from subprocess import run cmd = [ 'pylint', 'qttools.py', '--disable=all', '--enable=E0401', '--init-hook=from pathlib import Path; import sys;sys.path.append("./../common");' ] run(cmd)
如果想让代码更清晰,也可以拆分后再拼接:
from subprocess import run # 先写出清晰的代码逻辑 init_hook_lines = [ 'from pathlib import Path', 'import sys', 'sys.path.append("./../common")' ] # 用分号连接成单行代码,适配pylint的--init-hook要求 init_hook_code = '; '.join(init_hook_lines) cmd = [ 'pylint', 'qttools.py', '--disable=all', '--enable=E0401', f'--init-hook={init_hook_code}' ] run(cmd)
补充说明
在bash中,引号是用来告诉Shell把引号内的内容作为单个完整参数传递;但subprocess.run的列表模式下,每个列表元素本身就是独立参数,不需要额外添加引号。之前的写法会让pylint执行带引号的代码,相当于在Python中运行"from pathlib...,自然无法正确识别路径并添加到sys.path中。
内容的提问来源于stack exchange,提问作者buhtz
相关产品推荐
相关产品推荐

