Python 从父目录导入脚本
如何导入驻留在父目录中的模块(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
\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,它就会工作。@jgrittysys.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