Python 使用subprocess.check_输出运行flake8
我正在尝试制作一个基本的linter脚本,可以在当前目录中的Python文件上运行。到目前为止,我的脚本如下所示:Python 使用subprocess.check_输出运行flake8,python,subprocess,flake8,Python,Subprocess,Flake8,我正在尝试制作一个基本的linter脚本,可以在当前目录中的Python文件上运行。到目前为止,我的脚本如下所示: import subprocess from os import listdir from os.path import isfile, join if __name__ == "__main__": subprocess.check_output(["black", "-l", "100", "./"]) files = [f for f in listdir
import subprocess
from os import listdir
from os.path import isfile, join
if __name__ == "__main__":
subprocess.check_output(["black", "-l", "100", "./"])
files = [f for f in listdir("./") if isfile(join("./", f))]
for file in files:
if file.endswith(".py"):
subprocess.check_output(["flake8", file])
我希望通过命令行通过main.py之类的调用来运行代码。Black执行得很好,在当前目录中查找.py文件并对其进行格式化,不会出现问题。但是,当尝试使用flake8运行类似命令时,它也会在我不感兴趣的目录的子目录(如venv文件夹)上运行
因此,脚本包含一个检查,以获取当前目录中的文件,然后查找.py文件。但是,一旦获得这些文件,我似乎就无法将flake8命令用于subprocess.check_输出。我得到的错误如下:
Traceback (most recent call last):
File "linter.py", line 18, in <module>
subprocess.check_output(["flake8", file], shell=False)
File "C:\Users\calum\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 411, in check_output
return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
File "C:\Users\calum\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 512, in run
raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['flake8', 'flask_server_controller.py']' returned non-zero exit status 1.
有人能解释一下错误和/或提供解决我问题的方法吗。我还想在脚本中添加其他linting工具,例如pylint,但是,我担心在没有正确理解它的情况下会遇到同样的问题
提前谢谢 由于检查方面的原因,subprocess.check\u输出提供了这一点
这意味着,当您正在运行的可执行文件返回非零时(例如,flake8在检测到lint故障时返回非零),将引发异常
为了避免这种行为,我建议改用subprocess.run,并沿着返回代码转发。大概是这样的:
import subprocess
from os import listdir
from os.path import isfile, join
if __name__ == "__main__":
subprocess.check_output(["black", "-l", "100", "./"])
files = [f for f in listdir("./") if isfile(join("./", f))]
for file in files:
if file.endswith(".py"):
subprocess.check_output(["flake8", file])
导入操作系统
导入子流程
导入系统
def主:
ret=0
输出=b
对于os.listdir“”中的文件名:
如果文件名为.endswith'.py':
proc_ret=subprocess.run
“flake8”,文件名,
stdout=子流程.PIPE,
ret |=proc_ret.returncode
输出+=proc_ret.stdout
sys.stdout.buffer.writeoutput
回程网
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
出境旅客
请注意,这将是令人望而却步的缓慢,您必须为每个文件承担flake8的启动成本
一种改进方法是将所有文件名一次性传递给flake8:
导入操作系统
导入子流程
导入系统
def主:
filename=fname表示os.listdir'.'中的fname,如果fname.endswith'.py'
proc_ret=subprocess.run'flake8',*文件名,stdout=subprocess.PIPE
sys.stdout.buffer.writeproc\u ret.stdout
返回过程返回代码
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
出境旅客
但这也引出了另一个有趣的问题,为什么要收集输出呢?如果让输出转到标准输出,则会自动打印:
导入操作系统
导入子流程
def主:
filename=fname表示os.listdir'.'中的fname,如果fname.endswith'.py'
返回子进程。调用'flake8',*文件名
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
出境旅客
嗯,您可能根本不需要这样做,因为flake8有自己的包含/排除代码-您可能只想正确配置排除
然后你可以用8片。照常
免责声明:我是flake8的当前维护者,请自己在控制台中运行“flake8 flask\u server\u controller.py”以查看错误。我假设您需要将完整路径传递给flake,并确保flake位于您的env/path变量中。您为什么不使用实际适合此任务的工具(如shell脚本)?@MauriceMeyer感谢您的回复。如果我按照建议在文件上运行上面的命令,那么flake8可以工作。没有错误,因此,我认为这不是一个flake或env问题。@tripleee没有主要原因。我在其他一些帖子上看到,shell脚本不是一个好主意,但由于我的经验很少,请随时提供使用它的答案。我已尝试将标志shell=True添加到子流程中。请检查\u输出[flake8,file],shell=True,但是,这没有任何区别。请检查flask\u server\u controller.py的路径,或者查看其中提到的stderr:。退出状态1肯定是来自flake8的“响应”。感谢您的回复。我在另一篇文章中设法解决了这个问题,但是你提出的一些观点我将改变并实施。感谢您的帮助: