我在看似简单的任务中度过了许多夜晚 - 如何在Python中导入本地模块?
我已阅读过有关变通办法(adding to sys.path或more robust solutions),但其他图书馆未使用此类变通办法(例如,{{ 3)} in tf)。我不希望我真的不得不这样做,我希望能够在一行上导入并运行 - 我一定会遗漏一些东西!
为了具体,我有类似以下目录:
project/
foo/
src/
__init__.py
bar.py
foo/
__init__.py
boo.py
我希望在bar.py中我可以简单地编写类似from foo import boo
的内容,但是我的IDE,PyCharm认为这是一个错误。
所以,相信我的IDE,我尝试from src.foo import boo
,但这会导致一个ImportError,经过测试:
Traceback (most recent call last):
File "bar.py", line 1, in <module>
from src.foo import boo
ImportError: No module named 'src'
我验证了src文件夹位于sys.path[0]
,但是插入__file__似乎确实解决了问题 - 我仍然不想使用此解决方法,但作为最后的手段。
我已经尝试了其他一百万种技巧,但却没有成功。
如何在不使用其中一种解决方法的情况下从本地模块导入?
答案 0 :(得分:2)
此问题是由PyCharm中的错误引起的。使用from foo import bar
的初始本能是正确的,尽管PyCharm假定错误,但仍可正常工作。它声称src是一个模块的事实应该引起我的警觉。
可以安全地忽略PyCharm警告,并且可以运行代码。
为了阻止PyCharm在将来误导我们,我们必须禁用“未解决的参考资料”。检查。这可以通过搜索未解析的参考文献来完成。在“设置”中并禁用Python检查。
答案 1 :(得分:1)
这里有几件事情,所以让我们把它分解。
上层foo目录模糊了Pycharms解析顺序。让我们试试这个结构:
project/
foo_1.py
src/
__init__.py
bar.py
foo_2.py
默认情况下,Pycharm假定项目/在分辨率顺序中具有优先权。在我的示例中,如果您开始在bar.py中键入“import f”,Pycharm的自动完成将建议foo_1而不是foo_2。因此,当你导入foo时,Pycharm认为它是顶级foo,并且boo是无法解析的。
假设bar.py有这一行:
import foo_2
如果直接运行bar.py,它将起作用,因为Python将当前工作目录添加到Python Path。但是,请从其他任何地方拨打电话,然后再遇到麻烦。编辑foo_1.py以获得这一行:
import src.bar
直接运行foo_1.py(这使得CWD项目/)和bar.py将无法找到foo_2。 对于任何将使用您的软件包并且不使用project / src作为CWD的人来说,这是一个严重的问题,这将是每个人。
标准做法是在分发后命名源文件夹。假设'src'是您的发行版的名称,bar.py应该这样做:
import src.foo_2
我假设你正在写一个包。如果bar.py是一个脚本,因此很可能直接调用,那么你可以假设它每次都会成功,你应该只禁用该行的检查:
#noinspection PyUnresolvedRefrences
import foo