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

时间:2015-03-27 03:58:14

标签: intellij-idea pycharm

我使用许多共享命名空间的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了解命名空间的每个部分?

2 个答案:

答案 0 :(得分:1)

包是否在单独的项目中?

我认为我遇到了同样的问题并且已经向JetBrains提交了支持票。

如果在第二个包中你可以导入cantrips.entropy但是在代码正文中如果代码检查不能解决cantrips.entropy,例如:

import cantrips.entropty

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

IDE抱怨" entropy"在my_func中没有通过突出显示为黄色来解决。

一些解决方法是使用alais:

import cantrips.entropty as cantrips_entropty

def my_func():
    cantrips_entropy.do_stuff()
    ...

或者使用"来自导入"语法:

from cantrips.entropty import do_stuff

def my_func():
    do_stuff()
    ...

希望这有帮助

答案 1 :(得分:0)

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

使用名称空间软件包的诀窍是,一个软件包分布在多个目录中,一旦您了解了这一事实,就很容易了。

通常使用PyCharm,将内容根目录或项目根目录设置为您在(普通包的默认值)中打开项目的目录,因为它不需要名称空间包。这会混淆PyCharm,因为它会为解释器设置相应的结构以设置PYTHONPATH。

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

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

因此,如果您的结构为

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

将“内容根目录”设置为rootdir,而不是将其设置为包含namespace的所有目录,例如dist_package1dist_package2

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

这应该将未解析的引用修复为名称空间包

更新(07/25/2019):

您可以用鼠标右键单击dist_package1dist_package2并选择

Mark Directory As -> Sources Root

这应该解决您的进口问题