从父目录导入脚本

saz*_*azr 67 python import

如何导入驻留在父目录中的模块(python文件)?

两个目录都有一个__init__.py文件,但我仍然无法从父目录导入文件?

在此文件夹布局中,脚本B正在尝试导入脚本A:

Folder A:
   __init__.py
   Script A:
   Folder B:
     __init__.py
     Script B(attempting to import Script A)
Run Code Online (Sandbox Code Playgroud)

脚本B中的以下代码不起作用:

import ../scriptA.py # I get a compile error saying the "." is invalid
Run Code Online (Sandbox Code Playgroud)

jfs*_*jfs 67

您不导入导入模块的Python脚本.一些python模块也是可以直接运行的脚本(它们在模块级别执行一些有用的工作).

一般来说,最好使用绝对进口而不是相对进口.

toplevel_package/
??? __init__.py
??? moduleA.py
??? subpackage
    ??? __init__.py
    ??? moduleB.py
Run Code Online (Sandbox Code Playgroud)

moduleB:

from toplevel_package import moduleA
Run Code Online (Sandbox Code Playgroud)

如果您想以moduleB.py脚本形式运行,请确保父目录toplevel_package位于您的脚本中sys.path.

  • 为什么在这种情况下不应该使用sys路径"hacks"?如果没有它们,Python很难在这里做你想做的事情.究竟什么是缺点? (6认同)
  • 这个解决方案对我不起作用.它引发:"ImportError:没有名为toplevel_package的模块" (6认同)
  • @BT*«`sys.path.append(path_to_parent)`»*不应该是如何解决*«"import ../scriptA.py的答案#我得到编译错误说"."无效" "*题.有些情况下,更改`sys.path`可能是有用的,例如,如果python本身已经完成它或者一个三方模块处理所有角落案例正确完成它,例如,`import autopath; autopath.add_toplevel_to_syspath()`自动将toplevel_package的父目录添加到`sys.path`,以允许直接内部模块作为脚本(或在REPL中)从任何目录执行,而无需正确的PYTHONPATH或(virtualenv)安装. (3认同)
  • @JFSebastian对于该功能是否有某种建议,使我们可以明确地说出整个项目的主文件夹或软件包是什么,这样我们就不必在乎将父目录添加到sys.path中了,因此可以同时将子模块作为主文件或脚本运行吗?我有一个项目,我确实需要将导入的脚本作为主要脚本或模块运行,但是我需要做大量的黑客工作,将路径添加到sys.path中,以使其在两种情况下均能正常工作。是否可以在virtualenv中工作或使用setuptools以某种方式工作?我真的为此感到挣扎... (2认同)
  • @nbro这个功能被称为`pip install main-package`.你可以运行"子模块"(只需使用它们的绝对名称,例如`python -ma.bc`).如果不清楚; [问](http://stackoverflow.com/questions/ask) (2认同)

Rob*_*ers 26

来自文档:

from .. import scriptA
Run Code Online (Sandbox Code Playgroud)

您可以在包中执行此操作,但不能在直接运行的脚本中执行此操作.从上面的链接:

请注意,显式和隐式相对导入都基于当前模块的名称.由于主模块的名称始终为"__main__",因此用作Python应用程序主模块的模块应始终使用绝对导入.

如果您创建导入ABB的脚本,则不会收到ValueError.

  • ValueError:在非包中尝试相对导入 (22认同)
  • @jgritty,那是因为你是在一个你直接运行的脚本中做的. (3认同)
  • @jgritty`sys.path.append(“ ..”)`是您要寻找的 (3认同)
  • 你是对的.如果您调用脚本然后导入脚本B,它将起作用. (2认同)
  • 终于,六年后,我一直在寻找代码段! (2认同)

小智 6

如果你想直接运行脚本,你可以:

  1. 将 FolderA 的路径添加到环境变量 ( PYTHONPATH)。
  2. sys.path在脚本中添加路径。

然后:

import module_you_wanted
Run Code Online (Sandbox Code Playgroud)