从Python中的姐妹子目录导入?

2024-10-01 09:35:48 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我已经看到了一些关于堆栈溢出的类似问题,但似乎没有什么能解决我的问题,或者一般情况。所以,希望这个问题能解决这个问题,让我不再头疼。我有一个git回购,形式如下:

repo/
   __init__.py
   sub1/
      __init__.py
      sub1a/
         __init.py
         mod1.py
   sub2/
      __init__.py
      mod2.py

我如何从mod1.py导入mod2.py,反之亦然,根据mod1.py或mod2.py是脚本(当每个脚本都在导入——而不是被导入)时,该如何改变?在


Tags: pygit脚本init堆栈情况repo形式
3条回答

如果您使用的是Python 2.6+,您有两个选择:

  • 相对进口
  • repo添加到您的PYTHONPATH

对于相对导入,使用特殊的点语法:

在子包1中:

from .sub2.mod2 import thing

在sub1a包中:

^{pr2}$

请注意,普通import语句(import module)不适用于相对导入。在

更好的解决方案是在Python路径设置正确的情况下使用绝对导入(例如bash):

export PYTHONPATH=/where/your/project/is:$PYTHONPATH

更多信息:

脚本或模块可以导入

  1. 在系统路径上,或
  2. 作为导入脚本/模块的同一个包的一部分。在

对于模块,这些规则毫无例外地适用。对于脚本,规则是适用的,但问题是,在默认情况下,当您运行脚本时,它不被视为包的一部分。在

这意味着默认情况下,脚本只能导入系统路径上的模块。默认情况下,路径包含当前目录,因此如果您运行脚本,它可以导入同一目录中的模块或作为子目录的包。但就这样。脚本在目录树中没有“它在哪里”的概念,因此它不能执行任何需要有关封闭目录的特定相对路径信息的导入。这意味着您不能“从父目录”或“从同级目录”导入内容。只有在系统路径上时,才能导入这些目录中的内容。在

{1>如果你想在一个包中添加一个属性。见this previous question。然后,通常可以从该脚本中使用显式的相对导入(例如,from ...sub2 import mod2)。在

最简单的解决方案是将包含repo的目录放在PYTHONPATH中,然后只使用绝对路径导入,例如import repo.sub2.mod2等等。在

任何其他的解决方案都会涉及到一些黑客行为,如果你想让它涵盖你从任意目录直接调用这两个python文件的情况-很可能是sys.path损坏来有效地完成与设置PYTHONPATH相同的事情,但不必让用户设置它。在

相关问题 更多 >