【发布时间】:2019-10-04 20:52:52
【问题描述】:
我有一个包含一堆函数的目录和另一个包含我希望能够从终端运行的主项目的文件夹:kf_sine_demo.py。
当我逐行运行 VS-Code 中的代码时(使用 Shift+Enter),一切正常。
特别是我可以导入功能以供进一步使用:
from EKFUKF_Py import lti_disc, kf_predict, kf_update, rts_smooth
但是,当我从终端运行文件时:
python kf_sine_demo.py
我收到以下错误:
Traceback (most recent call last):
File "EKFUKF_Py/demo/kf_sine_demo/kf_sine_demo.py", line 16, in <module>
from EKFUKF_Py import lti_disc, kf_predict, kf_update, rts_smooth
ModuleNotFoundError: No module named 'EKFUKF_Py'
我看到了包括指定完整路径的解决方案。我对相对进口有强烈的偏好。
更新:
这个解决方案对我最有用:https://stackoverflow.com/a/37193862/4576194。
- 从
EKFUKF_Py的父目录运行python -m EKFUKF_Py.demo.kf_sine_demo.kf_sine_demo
但是,这不是我想要的。我希望能够从kf_sine_demo 目录运行python kf_sine_demo.py,并且我希望它知道它需要导入的函数位于2 级以上。
【问题讨论】:
-
我尝试从
EKFUKF_Py目录执行但没有任何运气。 -
异常消息?这也不起作用:
File "demo/kf_sine_demo/kf_sine_demo.py", line 16, in <module> from . import lti_disc, kf_predict, kf_update, rts_smooth ImportError: cannot import name 'lti_disc' from '__main__' (demo/kf_sine_demo/kf_sine_demo.py) -
如果您需要访问两个父文件夹中的文件,您可以将它们附加到路径变量:
sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.path.pardir, os.path.pardir)) -
我猜它可以在 VS-Code 中使用,因为我已将
EKFUKF_Py添加为工作目录。 @RoyM 与进行相对导入不同,是吗?有什么方法可以告诉它查找 2 级以上的文件,而不管它在什么位置? -
使用我的行,您将目录 EKFUNKF_Py 添加到您的路径变量中。有了它,您可以从每个文件中导入函数,如下所示:
from lti_disc import *等。EKFUKF_py 在这种情况下不是模块,这可能就是您收到错误的原因。如果您的文件以递归方式尝试相互导入,则此解决方法对您不起作用。然后,您可能应该按照 olinox 的建议配置__init__.py-file。或者从一个合适的地方调用文件的执行开始。