格式化器黑在我的VSCode上不起作用...但为什么?

58

我已经开始使用Python和Django,对这个领域非常新手。 而且,这是我第一次在这里提问...如果这个问题有已知的解决方案,我提前道歉...

当我安装并设置VSCode格式化工具'black'(在设置了linter为flake8之后),教程视频中出现了一个弹出窗口,显示'formatter autopep8未安装。要安装吗?'。而我的电脑上没有出现这个消息。

所以我做的是...

  1. 在终端上手动输入'pipenv install flake8 --dev --pre'。

  2. 在'.vscode'文件夹下的'settings.json'中手动输入"python.formatting.provider": "black"。

  3. 设置(VSCode) -> flake8, Python > Linting: Flake8 Enabled(也在workspace中进行了修改),勾选 Whether to lint Python files using flake8

以下是来自settings.json(位于vscode文件夹中)的代码:

{
  "python.linting.pylintEnabled": false,
  "python.linting.flake8Enabled": true,
  "python.linting.enabled": true,
  "python.formatting.provider": "black", # input manually
  "python.linting.flake8Args": ["--max-line-length=88"] # input manually
}

我找到了一个名为'black formatter'的文档。https://github.com/psf/black,它说明... 运行命令:python -m black {source_file_or_directory},然后我收到以下错误信息。

    Usage: __main__.py [OPTIONS] [SRC]...
Try '__main__.py -h' for help.

Error: Invalid value for '[SRC]...': Path '{source_file_or_directory}' does not exist.


是的,老实说,我不确定应该设置哪个源文件或目录...但最重要的是,现在我担心自己是否走在正确的轨道上。
能听听你的建议吗?至少给我一些方向,谢谢。

哇...我想现在我部分地明白了这里每个帖子的情况。谢谢大家的帮助!保重! - mireumireu
这是一个固定的链接- https://stackoverflow.com/questions/57750880/vs-code-autoformats-python-code-to-use-2-tabs/57751169#57751169 - undefined
21个回答

93

更新 2023-09-15:

现在 VSCode 有一个Microsoft 官方 Black Formatter 扩展。它很可能能解决你的问题。

原始回答:

我在 VSCode 中使用 Black,效果非常好。它能帮你节省决定代码格式的思考时间。最好在你喜欢的编辑器中使用它。如果需要一次性格式化多个文件,只需从命令行运行即可。

首先,检查一下你的 VSCode 的 settings.json 中是否有这个设置(使用 Ctrl-P + settings 打开):

"python.formatting.provider": "black",
"editor.formatOnSave": true,

请记住,可能会有两个 setting.json 文件:一个在您的主目录中,另一个在您的项目中(.vscode/settings.json)。项目内的文件优先。
话虽如此,这类问题通常是因为使用了未安装 black 的 Python 解释器。我建议使用虚拟环境,但首先请检查状态栏上的 Python 解释器。

Python interpreter in the status bar of VSCode

如果您没有明确选择一个解释器,请立即点击状态栏中的Python版本来选择。您也可以使用Ctrl-P + "Python: Select Interpreter"来选择解释器。选择后,状态栏应该会发生变化。
现在打开一个新的终端。由于您已经选择了解释器,VSCode应该会自动激活您的虚拟环境。使用您的解释器路径运行Python,并尝试导入black。
$ python
Python 3.7.3 (default, Mar 27 2019, 22:11:17) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import black
>>> 

导入失败?问题解决了。只需使用venv中的解释器安装black:python -m pip install black。您也可以使用Conda进行安装,但根据我的经验,VSCode与pip配合得更好。
还是无法正常工作?点击"TERMINAL"旁边的"OUTPUT"选项卡,并尝试在"Log"输出中获取更多信息。在下拉菜单中选择它。

log output of vscode


1
抱歉回复晚了。你甚至向我展示了一个更好的选择!非常感谢,保重! - mireumireu
6
对我来说,检查输出的“Python”日志很有用。当调用“格式化文档”时,“日志(主要)”中不包含任何信息。 - typ1232
如果您已经完成了上述所有过程,但仍然被阻止。您可以将您的“黑色”套餐升级到最新版本。在升级到“22.3.0”后,它对我很有效。 - Jaden
我曾经遇到过同样的问题。我通过Conda安装了Black,最新可用版本为19.10b0=py_0。我的Conda环境是活动状态,但Black在VS Code中没有任何反应。因此,我通过Conda卸载了Black,并在我的Conda环境内通过PyPI(pip)重新安装了它。通过PyPI可用的最新版本为22.3.0。现在,Black在VS Code中可以正常工作了。 - leifericf
1
此答案自2023年9月1日起在VS Code Aug 2023和可能的7月2023已不再正确。您现在需要安装一个单独的扩展(Microsoft的Black Formatter)。请参阅https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter - undefined
显示剩余2条评论

54

针对那些仍然无法解决 VS Code 中的黑色格式问题,我提供了以下内容。

首先,您必须全局或本地安装 Black(如果使用像 conda 这样的虚拟环境)。

然后,请确保您的 VS 设置如下,将 Python 默认格式化程序提供程序设置为“black”:

输入图像描述

最后,打开 VS Code 的 settings.json,添加以下部分。

"[python]": {
    "editor.defaultFormatter": null,
    "editor.insertSpaces": true,
    "editor.tabSize": 4,
    "editor.formatOnSave": true
}

关键点是:

"editor.defaultFormatter": null

如果您仍然像许多旧帖子建议的那样使用"editor.defaultFormatter": "black",则在较新的VS Code中,Black格式化程序将无法工作。


7
谢谢!这个解决了我的问题:"editor.defaultFormatter": null - Elena
4
这对我也起作用了,其他的任何东西都没有。 - Timothy Dalton
是的,这对我也起作用了!这个问题让我发疯了! - Mad Max
1
这是一个非常奇怪的 bug。 - wordsforthewise
这对我没有起作用。编辑器抱怨没有设置格式化程序,并让我再次选择微软的那个。然而,我完全删除了这行代码,最终使格式化程序正常工作了。 - Clark
此答案自2023年9月1日起在VS Code Aug 2023和可能的7月2023已不再适用。您现在需要安装一个单独的扩展https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter - undefined

11

对于那些尝试过所有方法的人 :).

在 VSCode 中,如果您有

  • 语法错误,
  • IPython 魔术命令(例如 %matplotlib inline

则 Black 无法正常工作。从终端运行 black 命令可以发现这些问题。


9

像camab所说,你完全可以从命令行运行它:

$ black file.py

您可以在整个文件夹(目录)中运行Python文件:
例如,如果我有以下内容:
src/
| - module/
|   | - moduleFile.py
|   \ - __init__.py
|
\ - script.py

并运行

$ black src

这将格式化moduleFile.py__init__.pyscript.py文件。

关于你的VSCode配置,我也喜欢在settings.json中进行设置。

{
    "editor.formatOnSave": true,
    "python.linting.lintOnSave": true,
}

我希望每次保存文件时都会进行代码审查和格式化,以确保代码质量。

如果您在使用VSCode时遇到代码审查或格式化问题,可以使用“命令面板”(Ctrl+Shift+P)强制执行以下命令:

  • Python: 运行代码审查
  • Python: 选择代码审查器
  • 格式化文档
  • 使用...格式化文档

如果出现实际问题,则会产生视觉弹出样式错误。

希望这对您有所帮助,祝您编码愉快!


谢谢您回答我的问题!保重! - mireumireu
这帮助我发现了以下错误:ImportError: 无法从 'click' 导入名称 '_unicodefun' - Zaffer

9

有一个新的扩展正在预发布,用于使用黑色格式化。 请参见v1.67 Release Notes, Python Black formatting

来自README(vscode Marketplace: Black Formatter):

用法

在安装在Visual Studio Code中后,“Black Formatter”将作为python文件的格式化程序可用。请选择“Black Formatter”(扩展ID:ms-python.black-formatter)作为默认格式化程序。您可以通过使用上下文菜单(在编辑器中右键单击打开的python文件),然后选择“使用...格式化文档”,或者将以下内容添加到设置中来实现此功能:

  "[python]": {
    "editor.defaultFormatter": "ms-python.black-formatter"
  }

保存时格式化

你可以通过在设置中加入以下值来启用Python的保存时格式化:

  "[python]": {
    "editor.defaultFormatter": "ms-python.black-formatter",
    "editor.formatOnSave": true
  }

没有其他方法适用于我。 - MattG
这个方法成功了! 我使用了 Command-Shift-P --> 格式化文档,然后它提示选择默认格式化工具,因为之前没有设置过。非常感谢! - SilentRhetoric
我认为很多混淆的原因是这个插件还非常新,所有在线建议都参考旧插件或者解释如何使用本地版本的黑色(而不是插件中捆绑的版本)。 - Captain Man

9

对于那些看到这条消息并且上述解决方案都无法解决问题的人,如果将黑色路径设置为其绝对位置可能会解决问题。

在此输入图片描述


3
其他答案都没用,但这个对我有用。 - rcarroll901

5

另一个可能性是您添加了格式不正确的黑色参数。插件希望每个以空格分隔的选项都被添加为设置UI中自己的“项目”,如下图所示:black args setting

您应该能够正确地将参数传递到输出-> Python控制台,如下所示:good black command

它不应该看起来像这样:

bad black command


是的!这也是我的问题。谢谢:) 修复这个问题花了很长时间 - 这些问题应该被记录下来! - sunew

5
你可以按照下面的步骤安装Black extensionVSCode。*我在Windows 11上使用Anaconda

enter image description here

然后,将下面的代码设置到settings.json中。*你可以查看我的回答来了解如何打开settings.json
// "settings.json"

"[python]": {
    "editor.defaultFormatter": "ms-python.black-formatter",
    "editor.formatOnSave": true
}

以下是我完整的settings.json代码:
// "settings.json"

{
    "python.defaultInterpreterPath": "C:\\Users\\kai\\anaconda3\\python.exe",
    "window.zoomLevel": 3,
    "files.autoSave": "afterDelay",
    "breadcrumbs.enabled": false,
    "[python]": { // Here
        "editor.defaultFormatter": "ms-python.black-formatter",
        "editor.formatOnSave": true
    }
}

2
请注意,此扩展默认情况下使用自己的捆绑版本的Black。如果要强制它使用您环境中的black可执行文件,请使用"black-formatter.importStrategy": "fromEnvironment" - Niko Föhr

3
另一个可能性是语法错误阻止了Black的工作。如果存在语法错误,Black将不会应用任何格式更改。
但是,VS Code仍然在状态栏中显示“使用Black进行格式化”,并且悄悄地失败。
您可以通过从命令行运行Black来验证这一点,如果有错误,它将显示出来:
$ black foo.py
error: cannot format foo.py: Cannot parse: 328:4:     :

Oh no!   
1 file failed to reformat.

像一个明智的人说:感谢您提供的解决方案。我一直在苦苦思索,为什么有时格式化会失败。而且这是随机的。 - user2359003

3

我曾经遇到过同样的问题,唯一的解决方法是删除

   "python.formatting.blackArgs": ["--skip-numeric-underscore-normalization"],  

从setting.json文件中获取。虽然不太合理,但它能正常工作。


1
完全就是我的情况!!我简直要疯了。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接