我有一个目录,其中包含一堆函数,另一个目录包含我的主项目,我想从终端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。
python -m EKFUKF_Py.demo.kf_sine_demo.kf_sine_demo
的父目录运行EKFUKF_Py
但是,那不是我想要的。我希望能够从python kf_sine_demo.py
目录运行kf_sine_demo
,并且希望它知道其需要导入的功能位于2层以上。
答案 0 :(得分:1)
您必须了解python路径的工作方式。这是python查找要尝试导入的模块的目录列表,您可以使用sys.path
命令来显示它。 python自动添加到一堆目录,例如path\to\your_python_install\lib
,并且在运行脚本时python也添加工作目录。
这意味着当您这样做时:
python kf_sine_demo.py
此文件的父目录(kf_sine_demo)已添加到路径,但EKFUKF_Py
未添加。因此python无法在其中找到模块。
从这里开始,有两个解决方案。您可以手动添加此目录(我觉得这个目录有点难看,但是可以用):
sys.path.append("path/to/EKFUKF_Py")
例如,您可以确保始终通过main.py
文件从主目录运行文件。从那里,您将能够调用此目录中的每个子模块。
更多内容:https://www.devdungeon.com/content/python-import-syspath-and-pythonpath-tutorial