Pycharm 2018中的相对导入与Python 3.6中的相对导入不同。

22

我已经阅读了很多有关Python相对导入的讨论,我认为它令人困惑的原因之一是它在不同的Python版本中会有所改变(我的版本是3.6)。但是这里罪魁祸首似乎是PyCharm(除非我错了..),我想知道是否有人解决了这个问题。 对于这种布局的项目:

/project
    |-- __init__.py
    |---subfolder
            |-- __init__.py
            |-- AA.py
            |-- BB.py

假设AA.py文件里有一个名为myfunc的函数。现在我们在文件BB.py中写入以下导入语句:

from AA import myfunc

然后Python可以完美地运行,但PyCharm将其视为一个错误:enter image description here

所以为了让PyCharm满意,我可以在导入语句中加上.,然后这个错误似乎就得到了解决:

from .AA import myfunc

但是Python并不满意,给了我一个错误:ModuleNotFoundError: No module named '__main__.AA'; '__main__' is not a package

因此,总结一下,我使用实际可行的导入方式(即from AA import myfunc),但如果PyCharm能够以某种方式同意它,那将会很棒,因为这样可以提供自动完成、转到定义等功能。

不重复: 我知道似乎这个主题已经被反复讨论过很多次,但它也有许多方面。在这里,我谈论的是PyCharm方面的问题,因此就我所知,这个话题是新的。

  1. PyCharm如何处理模块的相对导入? - 是一个没有将根项目目录添加到PYTHONPATH中的用户
  2. PyCharm自动进行相对导入 - 谈论的是自动导入功能,而这里不是这种情况
  3. PyCharm中的子包和相对导入 - 谈论的是Python 2.7中的导入问题,而在这里我没有任何导入问题
  4. 相对导入又来了一次 - 提供了一个有关导入问题的很好的评论,并提供了非常详细的答案,但它都不能帮助我的情况,因为我没有任何导入问题。更不要说它是Python 2.7的主题,而不是3.x的主题了。
2个回答

33

在项目树中右键单击文件夹subfolder,选择"Mark Directory As"->"Sources Root"标记为源代码根目录。PyCharm默认将所有源代码根目录添加到PYTHONPATH中,应该可以解决问题。

问题是PyCharm不知道您要直接执行BB.py,例如假设您的根目录中有main.py,其中包含语句from subfolder import BB。调用python main.py会引发ModuleNotFoundError:No module named 'AA'错误(确保使用Python 3避免来自Python 2的隐式相对导入)。

希望这有意义,我没有漏掉任何内容。


但是看起来相对导入的版本 from .AA import myfunc 不起作用,因为 __package__ 没有定义。我们该怎么解决这个问题? - flow2k
如果为导入文件指定了子目录,则即使没有源根标记,它也可以正常工作。 - jMike
谢谢您,您救了我的一天! - Demian

4

您可以通过以下方法使Python和PyCharm达成一致:

from subfolder.AA import myfunc

然而,根据这里所述,from .AA import myfunc 似乎是正确的语法。但我不知道为什么它不能正常工作。


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