如何让IntelliJ/PyCharm能够正确识别Python命名空间的每个部分?

Lui*_*lli 6 intellij-idea pycharm

我使用许多共享命名空间的python包(setuptools支持它).这些与使用setuptools的python 2.7配合得很好.我的问题是关于IntelliJ的PyCharm插件:它没有完全识别包的文件和成员.

假设我有很多包:

第一包:

cantrips
+--- types
|    +--- ...
+--- patterns
|    +--- ...
+--- (more subpackages here)
+--- entropy.py
+--- (more *.py files here)
Run Code Online (Sandbox Code Playgroud)

第二包:

cantrips
+--- watch
     +--- ...
Run Code Online (Sandbox Code Playgroud)

如果我尝试在里面导入任何东西cantrips.watch或者cantrips.entropy我没有任何问题(这在Python27中完美运行).然而,IntelliJ IDEA 13中的Pycharm插件似乎无法cantrips.entropy通过代码检查找到.

问:如何才能正确地使IntelliJ/PyCharm理解命名空间的每个部分?

rit*_*hhh 5

我正在使用 PyCharm 2019.1 并且我找到了一种方法来做到这一点(它可能符合解决方法)

命名空间包的技巧在于,一个包分布在多个目录中,一旦您理解了这一事实,那就非常容易了。

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

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

File -> Settings -> Project Structure -> Add Content Root
Run Code Online (Sandbox Code Playgroud)

所以如果你有一个结构

rootdir/
+--dist_package1/
   +--namespace/
      +--file1.py
+--dist_package2/
   +--namespace/
      +--file2.py
Run Code Online (Sandbox Code Playgroud)

不要将“Content Root”目录设置为,而是将其设置为包含、和等rootdir所有目录。namespacedist_package1dist_package2

删除原来设置为 的内容根目录rootdir。

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

更新(2019 年 7 月 25 日):

您可以右键单击dist_package1并dist_package2选择

Mark Directory As -> Sources Root
Run Code Online (Sandbox Code Playgroud)

这应该可以解决您的导入问题


Adr*_*vis 2

这些包是否位于单独的项目中?

我想我也遇到了同样的问题,并已向 JetBrains 提交了支持票。

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

import cantrips.entropty

def my_func():
    cantrips.entropy.do_stuff()
    ...
Run Code Online (Sandbox Code Playgroud)

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

一些解决方法是使用 alais:

import cantrips.entropty as cantrips_entropty

def my_func():
    cantrips_entropy.do_stuff()
    ...
Run Code Online (Sandbox Code Playgroud)

或者使用“from import”语法:

from cantrips.entropty import do_stuff

def my_func():
    do_stuff()
    ...
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • 我的支持请求已变成错误:https://youtrack.jetbrains.com/issue/PY-16688 (2认同)