Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用subprocess.check_输出运行flake8_Python_Subprocess_Flake8 - Fatal编程技术网

Python 使用subprocess.check_输出运行flake8

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

我正在尝试制作一个基本的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("./") 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的“响应”。感谢您的回复。我在另一篇文章中设法解决了这个问题,但是你提出的一些观点我将改变并实施。感谢您的帮助: