【问题标题】:How can I make IntelliJ/PyCharm be able to correctly identify every part of a Python namespace?如何让 IntelliJ/PyCharm 能够正确识别 Python 命名空间的每个部分?
【发布时间】:2015-05-31 07:54:51
【问题描述】:

我使用许多共享命名空间的 python 包(setuptools 支持)。这些适用于带有 setuptools 的 python 2.7。我的问题是关于 IntelliJ 的 PyCharm 插件:它不能完全识别包的文件和成员。

假设我有很多包:

第一个包:

cantrips
+--- types
|    +--- ...
+--- patterns
|    +--- ...
+--- (more subpackages here)
+--- entropy.py
+--- (more *.py files here)

第二包:

cantrips
+--- watch
     +--- ...

如果我尝试在 cantrips.watchcantrips.entropy 中导入任何内容,我完全没有问题(这在 Python27 中完美运行)。 但是 IntelliJ IDEA 13 中的 Pycharm 插件似乎无法通过代码检查找到 cantrips.entropy

:如何正确让 IntelliJ/PyCharm 理解命名空间的每个部分?

【问题讨论】:

    标签: intellij-idea pycharm


    【解决方案1】:

    我正在使用 PyCharm 2019.1,并且我已经找到了一种方法(它可能符合解决方法)

    命名空间包的诀窍在于,一个包分布在多个目录中,一旦您了解了这一事实,就很容易了。

    通常使用 PyCharm,内容根目录或项目根目录设置为您在其中打开项目的目录(普通包的默认值),因为它不需要命名空间包。这让 PyC​​harm 感到困惑,因为它会相应地为解释器设置结构以设置 PYTHONPATH。

    要为命名空间包更正此问题,只需将所有具有命名空间文件夹的目录添加到内容根目录。

    File -> Settings -> Project Structure -> Add Content Root
    

    所以如果你有一个结构

    rootdir/
    +--dist_package1/
       +--namespace/
          +--file1.py
    +--dist_package2/
       +--namespace/
          +--file2.py
    

    不要将“Content Root”目录设置为rootdir,而是将其设置为包含namespace的所有目录,例如dist_package1dist_package2

    删除设置为rootdir的原始内容根。

    这应该会修复对命名空间包的未解析引用

    更新(2019 年 7 月 25 日):

    您只需右键单击dist_package1dist_package2 并选择

    Mark Directory As -> Sources Root
    

    这应该会解决您的导入问题

    【讨论】:

      【解决方案2】:

      这些包是否在不同的项目中?

      我认为我遇到了同样的问题,并已向 JetBrains 提交了支持请求。

      如果在第二个包中您可以导入 cantrips.entropy 但如果代码检查无法解析 cantrips.entropy 则在代码主体中,例如:

      import cantrips.entropty
      
      def my_func():
          cantrips.entropy.do_stuff()
          ...
      

      IDE 抱怨 my_func 中的“熵”未通过以黄色突出显示来解决。

      一些变通方法是使用别名:

      import cantrips.entropty as cantrips_entropty
      
      def my_func():
          cantrips_entropy.do_stuff()
          ...
      

      或者使用“from import”语法:

      from cantrips.entropty import do_stuff
      
      def my_func():
          do_stuff()
          ...
      

      希望对你有帮助

      【讨论】:

      • 我的支持请求已经变成了一个错误:youtrack.jetbrains.com/issue/PY-16688
      • 他们失败了,就像你说的那样,在你的情况下。但也有命名空间包安装在我的 -say- virtualenv 或全局 python 路径中的情况。如果使用命名空间,则永远不会解析那里的包。
      • 尝试在您的 pythonpath 中安装此类包(全局或 venv)并将它们作为项目删除:IntelliJ 将无法完全检测到它们(不仅仅是最后一个)。
      • 我使用的一种解决方法是为其他命名空间包根创建 pycharm 项目,并将这些项目附加到同一个 pycharm 会话中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      相关资源
      最近更新 更多