Python 从父目录导入脚本

Python 从父目录导入脚本,python,import,Python,Import,如何导入驻留在父目录中的模块(python文件) 这两个目录中都有一个\uuuu init\uuuuu.py文件,但我仍然无法从父目录导入文件 在此文件夹布局中,脚本B正在尝试导入脚本A: Folder A: __init__.py Script A: Folder B: __init__.py Script B(attempting to import Script A) 脚本B中的以下代码不起作用: import ../scriptA.py # I g

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

这两个目录中都有一个
\uuuu init\uuuuu.py
文件,但我仍然无法从父目录导入文件

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

Folder A:
   __init__.py
   Script A:
   Folder B:
     __init__.py
     Script B(attempting to import Script A)
脚本B中的以下代码不起作用:

import ../scriptA.py # I get a compile error saying the "." is invalid
从:

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

请注意,显式和隐式相对导入都基于 当前模块的名称。因为主模块的名称是 始终使用“\uuuu main\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu Python应用程序应始终使用绝对导入

toplevel_package/
├── __init__.py
├── moduleA.py
└── subpackage
    ├── __init__.py
    └── moduleB.py

如果创建导入a.B.B的脚本,则不会收到ValueError。

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

  • 将文件夹的路径添加到环境变量(
    PYTHONPATH
  • 将路径添加到脚本中的
    sys.path
  • 然后:


    在导入模块时,不会在Python中导入脚本。一些python模块也是可以直接运行的脚本(它们在模块级执行一些有用的工作)

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

    toplevel_package/
    ├── __init__.py
    ├── moduleA.py
    └── subpackage
        ├── __init__.py
        └── moduleB.py
    
    在模块B中:

    from toplevel_package import moduleA
    

    如果要以脚本形式运行
    moduleB.py
    ,请确保
    toplevel\u包的父目录位于
    sys.path

    值错误:尝试在非-package@jgritty,这是因为你是在直接运行的脚本中进行的。是的,你是对的。如果你调用一个脚本,然后导入脚本B,它就会工作。@jgritty
    sys.path.append(“…”
    )就是你要找的最后,6年后,我一直在找的代码片段!不完全回答您的问题,但如果您在文件夹A中运行init.py并尝试导入文件夹B或脚本B,脚本A将成功导入脚本B。在这种情况下,可能会重复sys path“hacks”,为什么不应使用?Python使得在没有它们的情况下很难做您想要做的事情。这里的缺点到底是什么?@BT«
    sys.path.append(path_to_parent)
    »不应该是如何修复«“import../scriptA.py»问题的答案,我收到一个编译错误,说“.”无效“»问题。在某些情况下,更改
    sys.path
    可能很有用,例如,如果python自己做了,或者一个三方模块正确地处理了所有角落的情况,例如,
    import autopath;autopath.add_toplevel_to_syspath()
    自动将toplevel_包的父目录添加到
    sys.path
    ,以允许在没有正确PYTHONPATH或(virtualenv)的情况下,以脚本(或REPL)的形式从任何目录直接执行内部模块install.@J.F.Sebastian是否有某种功能的建议,允许我们明确说明整个项目的主文件夹或包是什么,这样我们就不必关心将父目录添加到
    sys.path
    中,这样我们也可以将子模块作为主文件或脚本运行?我有一个项目,我真的需要将脚本作为主脚本或作为模块运行,这是导入的,但我需要做大量的hacks操作,将路径添加到
    sys.path
    ,以使它们在这两种情况下都能工作。在VirtualNV中工作或使用setuptools会有什么效果吗?我真的很难做到这一点…@nbro该功能名为
    pip install main package
    。您已经可以运行“子模块”(只需使用它们的绝对名称,例如,
    python-ma.b.c
    )。如果不清楚,;这个解决方案对我不起作用。它引发:“ImportError:没有名为toplevel_package的模块”
    from toplevel_package import moduleA