Python relative imports within a package not on the path

前端 未结 2 1999
北恋
北恋 2021-01-13 15:28

How can I import a file that is in a parent directory within a python package (that is not on the path) into a file in a child dir?

I\'m not totally clear on the voc

相关标签:
2条回答
  • 2021-01-13 15:54

    You can actually do this:

    import sys
    sys.path.append('..')
    

    and that will work. But don't do that. It could break other modules.

    I guess you could remove it directly after the import, but don't.

    EDIT:

    Actually, this also works and I think there's no reason it's not safe:

    inside in_dir2.py you can do:

    import sys
    import os
    current_module = sys.modules[__name__]
    indir2file=current_module.__file__
    sys.path.append(os.path.dirname(os.path.abspath(indir2file))+os.sep+".."+os.sep)
    import in_dir1
    

    Try hard to restructure your code instead.

    0 讨论(0)
  • 2021-01-13 16:12

    The answer is in the link you gave:

    Relative imports use a module's __name__ attribute to determine that module's position in the package hierarchy. If the module's name does not contain any package information (e.g. it is set to 'main') then relative imports are resolved as if the module were a top level module, regardless of where the module is actually located on the file system.

    You cannot do relative imports in __main__ scripts (i.e. if you directly run python in_dir2.py).

    To solve this, what PEP 366 allows you to do is set the global __package__:

    import dir1
    if __name__ == '__main__':
        __package__ = 'dir1.dir2'
        from .. import in_dir1
    

    Note that the package dir1 still has to be on sys.path! You can manipulate sys.path to achieve this. But by then, what have you achieved over absolute imports?

    0 讨论(0)
提交回复
热议问题