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

从Python中的姐妹子目录导入?,python,import,Python,Import,所以,我看到了一些关于堆栈溢出的类似问题,但似乎没有任何东西可以解决我的问题,或者说一般情况。所以,希望这个问题能解决这一问题,并停止我的头痛。我有一份git回购协议,格式如下: repo/ __init__.py sub1/ __init__.py sub1a/ __init.py mod1.py sub2/ __init__.py mod2.py 我如何从mod1.py导入mod2.py,

所以,我看到了一些关于堆栈溢出的类似问题,但似乎没有任何东西可以解决我的问题,或者说一般情况。所以,希望这个问题能解决这一问题,并停止我的头痛。我有一份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是脚本(当每个脚本都在导入时——不是导入时),这会发生什么变化?

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


任何其他解决方案都会涉及一些黑客行为,如果您想让它涵盖从任意目录直接调用两个python文件作为脚本的情况-最有可能的是
sys.path
mangling,以有效地完成与设置
PYTHONPATH
相同的任务,但无需用户设置。

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

  • 相对进口
  • repo
    添加到您的
    PYTHONPATH
对于相对导入,使用特殊的点语法:

在sub1包中:

在sub1a包中:

请注意,普通导入语句(
导入模块
)不适用于相对导入

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

更多信息:


脚本或模块可以导入

  • 在系统路径上,或
  • 作为导入脚本/模块的同一包的一部分
  • 对于模块,这些规则毫无例外地适用。对于脚本,规则适用,但缺点是,默认情况下,当您运行脚本时,它不被视为包的一部分

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


    如果要使脚本“知道”在包中,可以给它一个
    \uuuuuuuuuuuuuuu
    属性。看见然后,您可以正常地从该脚本中使用显式相对导入(例如,
    from…sub2 import mod2
    )。

    我可以编辑PYTHONPATH,但是有标准的方法来强制执行吗?我不希望所有的新用户都不得不手动进入并更新他们的Python路径。如果你不想让人们管理<代码> Python Puths/Cuth>自己,那么你可能需要考虑<代码> sys .Posith(例如,使用
    \uu file\uu
    plus
    os.abspath
    查找脚本所在的位置,然后获取目录,该目录上方的正确层数将成为
    repo
    的父目录,然后使用
    sys.path.insert
    它。)我真的希望这些相对导入能够工作。但是,在我的Python2.7上,它们不起作用。使用Python2.7,我成功地使用了sub2.mod2 import thing中的
    语句。
    
    from .sub2.mod2 import thing
    
    from ..sub2.mod2 import otherthing
    
    export PYTHONPATH=/where/your/project/is:$PYTHONPATH