Python,从父目录导入模

Python,从父目录导入模,python,import,module,Python,Import,Module,我想知道如何导入一级以上的文件。 我在谷歌上看到: >>> sys.path.append("../") 但我不喜欢它,我希望有更好的解决方案另一种选择,如果您正在编写的是软件包的一部分,则使用相对导入,如下所示: from .. import foo 其中foo是您尝试导入的模块的名称 同样,如果当前目录中有另一个模块,则可以使用: from . import bar 可悲的是(或者也许不是那么可悲),然而,这并没有延伸到更进一步。你不能向祖父母或更高级别的人求助 编辑

我想知道如何导入一级以上的文件。 我在谷歌上看到:

>>> sys.path.append("../")

但我不喜欢它,我希望有更好的解决方案

另一种选择,如果您正在编写的是软件包的一部分,则使用相对导入,如下所示:

from .. import foo
其中
foo
是您尝试导入的模块的名称

同样,如果当前目录中有另一个模块,则可以使用:

from . import bar

可悲的是(或者也许不是那么可悲),然而,这并没有延伸到更进一步。你不能向祖父母或更高级别的人求助

编辑

正如联合申诉委员会优雅地指出的那样,我最后的评论是不正确的:

从…系统导入路径

请注意,虽然最后一个案例是合法的,但它肯定是不被鼓励的(“疯狂”是Guido一词)


我一定把圭多对它的描述内化得太多了

编辑

好的,我刚刚在2.7中验证了这一点-这显然是你喜欢的深度,并且取决于

from .... import greatgrandparent

工作得很好。我想我需要另一个选择,如果你写的是一个包的一部分,那就是像这样使用相对导入:

from .. import foo
其中
foo
是您尝试导入的模块的名称

同样,如果当前目录中有另一个模块,则可以使用:

from . import bar

可悲的是(或者也许不是那么可悲),然而,这并没有延伸到更进一步。你不能向祖父母或更高级别的人求助

编辑

正如联合申诉委员会优雅地指出的那样,我最后的评论是不正确的:

从…系统导入路径

请注意,虽然最后一个案例是合法的,但它肯定是不被鼓励的(“疯狂”是Guido一词)


我一定把圭多对它的描述内化得太多了

编辑

好的,我刚刚在2.7中验证了这一点-这显然是你喜欢的深度,并且取决于

from .... import greatgrandparent

工作得很好。我想我需要

根据项目的组织方式,您可以正常导入它。假设您的项目结构如下所示:

/tmp/test_prj/launcher.py
/tmp/test_prj/mymodule/__init__.py
/tmp/test_prj/mymodule/helper.py
/tmp/test_prj/mymodule/mysubmodule/__init__.py
如果您使用启动器(
launcher.py,本例中为
launcher.py
),并且始终使用
/launcher.py
调用项目,则可以使用以下行导入
helper.py
内部
mysubmodule

from mymodule import helper
这是因为您当前的工作目录是
/tmp/test\u prj
。您可以使用打印系统路径检查它,它应该是第一个


如果我不够清楚,请告诉我:D

根据项目的组织方式,您可以正常导入项目。假设您的项目结构如下所示:

/tmp/test_prj/launcher.py
/tmp/test_prj/mymodule/__init__.py
/tmp/test_prj/mymodule/helper.py
/tmp/test_prj/mymodule/mysubmodule/__init__.py
如果您使用启动器(
launcher.py,本例中为
launcher.py
),并且始终使用
/launcher.py
调用项目,则可以使用以下行导入
helper.py
内部
mysubmodule

from mymodule import helper
这是因为您当前的工作目录是
/tmp/test\u prj
。您可以使用打印系统路径检查它,它应该是第一个


如果我不够清楚,请告诉我:D

这就是文件系统的工作方式。这就是文件系统的工作方式。“你不能向祖父母或更高级别的人求助。”PEP 328似乎暗示着你可以。我刚刚确认您可以(至少在Python3中;它不应该与Python2有什么区别,因为这个相对导入语法是在第一个版本中实现的)。“我一定把Guido对它的描述内部化了太多。^”Guido的描述不是指使用相对导入语法从标准Python模块导入项吗?(我的意思是,如果只从内置Python模块中进行相对导入来获取某些内容,这将是非常愚蠢的,因为对这些模块进行绝对导入更合理。)你能看看我的笑话给我带来的麻烦吗?我想我只是读得太快了。还有谁能从……确认这一点。。。。导入曾祖父母
有效吗?我想摆脱这种东西
sys.path.append(os.path.abspath(os.path.join('..','..','..','..'))
“你不能上祖父母或更高的级别。”PEP 328似乎暗示你可以。我刚刚确认您可以(至少在Python3中;它不应该与Python2有什么区别,因为这个相对导入语法是在第一个版本中实现的)。“我一定把Guido对它的描述内部化了太多。^”Guido的描述不是指使用相对导入语法从标准Python模块导入项吗?(我的意思是,如果只从内置Python模块中进行相对导入来获取某些内容,这将是非常愚蠢的,因为对这些模块进行绝对导入更合理。)你能看看我的笑话给我带来的麻烦吗?我想我只是读得太快了。还有谁能从……确认这一点。。。。导入曾祖父母
有效吗?我想摆脱这种东西
sys.path.append(os.path.abspath(os.path.join('..','..','..','..'))