这里有几件事发生了,让我们把它分解一下。在
上层foo目录混淆了Pycharms的解析顺序。让我们试试这个结构:project/
foo_1.py
src/
__init__.py
bar.py
foo_2.py
默认情况下,Pycharm假定project/在解析顺序中具有优先权。在我的示例中,如果您开始在棒.py,Pycharm的auto-complete将建议使用foo\u 1,而不是foo\u 2。因此,当您导入foo时,Pycharm假设它是顶级foo,而boo对于它来说是无法解决的。在
那么为什么Pycharm不假设foo峎2?
假设棒.py有一行:
^{pr2}$
如果你跑就行了棒.py直接因为Python将当前工作目录添加到Python Path中。但是,从任何地方打电话给你,你就有麻烦了。编辑foo_1.py以获得以下一行:import src.bar
直接运行foo_1.py(这使得CWD project/)和棒.py会找不到foo嫒2。
这对于将使用您的包并且不使用project/src作为CWD的任何人来说都是一个严重的问题,这将是每个人的问题。
如何修复
标准做法是在分发后命名源文件夹。假设'src'是您的发行版的名称,棒.py应该这样做:import src.foo_2
规则的例外
我假设你在写一个包裹。如果棒.py是一个脚本,因此很可能被直接调用,那么您可以假设它每次都会成功,您应该只对该行禁用检查:#noinspection PyUnresolvedRefrences
import foo