【问题标题】:Import function from parent directory从父目录导入函数
【发布时间】: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 &lt;module&gt; 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。或者从一个合适的地方调用文件的执行开始。

标签: python visual-studio-code


【解决方案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

【讨论】:

  • 所以,如果我有一些我想运行的演示,你会建议我将一个参数传递给main.py,并使用我感兴趣的演示名称?
  • 例如是的,但如果它不是生产应用程序并且只是用于测试目的,您可以轻松地使用第一个解决方案,并将sys.path.append 行添加到__init__.py kf_sine_demo 目录中或脚本开头的文件。您也可以将您的 from EKFUKF_Py import ... 行替换为 try: from EKFUKF_Py import ...; except ImportError: sys.path.append(...); from EKFUKF_Py import ...; 之类的内容(当然,将此处的分号替换为换行符)
猜你喜欢
  • 1970-01-01
  • 2013-11-09
  • 2016-12-27
  • 2013-05-22
  • 2012-05-28
  • 2012-07-08
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多