【问题标题】:VSCode Python autocomplete for generated code in separate directoryVSCode Python自动完成在单独目录中生成的代码
【发布时间】:2022-06-10 22:47:44
【问题描述】:

我使用裤子来管理一个使用协议缓冲区的 Python 项目。 Pants 将生成的 _pb2.py_pb2.pyi 文件放在单独的 dist/codegen 树下。使用 _pb2 模块时是否可以让 VS Code 自动完成功能工作?

文件树如下所示:

.
|-- dist/
|   `-- codegen/
|       `-- src/
|           `-- project/
|               |-- data_pb2.py
|               `-- data_pb2.pyi
`-- src/
    `-- project/
        |-- __init__.py
        |-- code.py
        `-- data.proto

code.py 我有这样的导入语句:

from project import data_pb2

我尝试在settings.json 中将python.analysis.extraPaths 设置为["dist/codegen/src"]。这使得 pylance 不再抱怨缺少data_pb2。但是自动补全仍然不起作用,pylance 没有data_pb2 成员的类型信息。

【问题讨论】:

    标签: python visual-studio-code protocol-buffers pants


    【解决方案1】:

    将您的python.analysis.extraPaths 替换为以下范围:

        "python.analysis.extraPaths": [
        "./dist/codegen/src"
         ],
    

    并将以下代码添加到您的 code.py:

    import sys
    sys.path.append(".\dist\codegen\src")
    

    【讨论】:

    • 这似乎没有帮助。仍然没有自动完成或输入信息。请注意,dist/codegen/src/project 中没有 __init__.py,所以我不希望修改 sys.pathPYTHONPATH 来提供帮助。
    • 这对我有用。它不需要在其中创建 init.py 。如果你不通过修改 sys.path 或 PYTHONPATH 告诉它,pylance 如何识别 __pb2。
    • 如果我将我的原型放在一个单独的目录中,我会得到自动完成和输入信息。例如,src/project/code.pysrc/data/data.proto 生成 dist/codegen/src/data/data_pb2.py。似乎将生成的代码放在同一路径会导致问题。
    【解决方案2】:

    您可以使用 Python 隐式命名空间包 (PEP 420) 来完成这项工作。命名空间包允许在同一个包中的模块驻留在不同的目录中。当代码在 srcdist/codegen/src 之间拆分时,这允许 pylance 和其他工具正常工作。

    要使用隐式命名空间包,您只需删除src/package/__init__.py,并将"python.analysis.extraPaths" 设置为["dist/codegen/src"]

    另请参阅 GitHub 问题 microsoft/pylance-release#2855,其中描述了使用隐式命名空间包使 pylance 在类似情况下正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      • 2011-05-14
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多