我已经阅读了有关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认为这是一个错误:
因此,为了使PyCharm满意,我可以将.
添加到导入中,然后似乎可以解决该错误:
from .AA import myfunc
但是后来python不高兴,给了我错误:ModuleNotFoundError: No module named '__main__.AA'; '__main__' is not a package
因此,总而言之,我使用了实际有效的导入(即from AA import myfunc
),但是如果我可以以某种方式让PyCharm同意它,那就太好了,因为它随后提供了诸如自动完成,定义和等等。
不重复: 我知道似乎已经反复讨论了这个主题,但它也有很多方面。在这里,我谈论的是pycharm方面,因此据我所知这个主题是新的。
答案 0 :(得分:6)
在项目树中右键单击,将subfolder
标记为Source Root->将目录标记为...-> 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隐式相对导入)。
希望这很有意义,我什么都没错过。
答案 1 :(得分:1)
您可以使用
来使python和pycharm都同意from subfolder.AA import myfunc
但是,根据here,from .AA import myfunc
似乎是正确的语法。但是idk为什么它不起作用。