Python imports relative path

后端 未结 3 672
星月不相逢
星月不相逢 2021-02-04 05:10

I\'ve got a project where I would like to use some python classes located in other directories.

Example structure:

/dir
 +../subdirA
 +../subdirB
 +../my         


        
相关标签:
3条回答
  • 2021-02-04 05:31

    On dir structure as following:

    /dir
     +../subdirA
     +../subdirB
     +../mydir
    

    combining with linux command ln , we can make things a lot simpler:

    1. cd dir/mydir
    2. ln -s ../subdirA ./
    3. ln -s ../subdirB ./
    

    And, now if you want to import some_stuff from file: dir/subdirA/fileA.py into your file: dir/mydir/myfile.py, simply import like this:

    from subdirA.fileA import some_stuff
    

    And, the same applies to 'dir/subdirB'

    What's More, this works for setup.py process, :)

    0 讨论(0)
  • 2021-02-04 05:35

    You will need an __init__.py in the mydir directory (and it can be empty), then as long as dir is in the sys path, assuming your MySampleClass is in myfile.py and myfile.py is in mydir

    from mydir.myfile import MySampleClass
    

    If you want to import top level functions from a file called util.py that reside in subdirA into myfile.py (where your class is), then an __init__.py must be in subdirA and then in myfile.py

    from subdirA.util import somefunc, someotherfunc
    

    The same is true of the sys path, that is, you must either start from 'dir' or add it. Everything is imported from the top level of the package (usually your project folder).

    However, for module testing, where you might run a function from util in the interpreter, if you start from subdirA, you will need to add dir to the sys path, so your imports can resolve.

    >>> import sys
    >>> sys.path.append('../dir')
    

    but this is a hack and would be preferable to only use from the interactive interpreter when you are testing. You can also add 'dir' to your site packages in a pth file.

    To use relative imports, you would need a deeper nested folder, like subdirA/subdirofA, then in subdirofA, you could use . to back out (like from .subdirB ). Really, for me, relative imports are somewhat difficult to see the utility. It's better for me to use direct imports relative to the project directory, but I could see them being useful if you wanted to nest a naive sub package, but again, still better to be explicit than implicit if possible.

    also see this

    0 讨论(0)
  • 2021-02-04 05:52

    first add the relative paths to the pythonpath

    import os
    
    import sys
    
    cwd = os.getcwd()
    
    sys.path.append(cwd + '/../subdirA/')
    
    sys.path.append(cwd + '/../subdirB/')
    

    then import the modules.

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