Python - Get path of root project structure

后端 未结 16 1813
陌清茗
陌清茗 2020-12-04 08:03

I\'ve got a python project with a configuration file in the project root. The configuration file needs to be accessed in a few different files throughout the project.

相关标签:
16条回答
  • 2020-12-04 08:34

    Try:

    ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    0 讨论(0)
  • 2020-12-04 08:37

    A standard way to achieve this would be to use the pkg_resources module which is part of the setuptools package. setuptools is used to create an install-able python package.

    You can use pkg_resources to return the contents of your desired file as a string and you can use pkg_resources to get the actual path of the desired file on your system.

    Let's say that you have a package called stackoverflow.

    stackoverflow/
    |-- app
    |   `-- __init__.py
    `-- resources
        |-- bands
        |   |-- Dream\ Theater
        |   |-- __init__.py
        |   |-- King's\ X
        |   |-- Megadeth
        |   `-- Rush
        `-- __init__.py
    
    3 directories, 7 files
    

    Now let's say that you want to access the file Rush from a module app.run. Use pkg_resources.resouces_filename to get the path to Rush and pkg_resources.resource_string to get the contents of Rush; thusly:

    import pkg_resources
    
    if __name__ == "__main__":
        print pkg_resources.resource_filename('resources.bands', 'Rush')
        print pkg_resources.resource_string('resources.bands', 'Rush')
    

    The output:

    /home/sri/workspace/stackoverflow/resources/bands/Rush
    Base: Geddy Lee
    Vocals: Geddy Lee
    Guitar: Alex Lifeson
    Drums: Neil Peart
    

    This works for all packages in your python path. So if you want to know where lxml.etree exists on your system:

    import pkg_resources
    
    if __name__ == "__main__":
        print pkg_resources.resource_filename('lxml', 'etree')
    

    output:

    /usr/lib64/python2.7/site-packages/lxml/etree
    

    The point is that you can use this standard method to access files that are installed on your system (e.g pip install xxx or yum -y install python-xxx) and files that are within the module that you're currently working on.

    0 讨论(0)
  • 2020-12-04 08:37

    I used the ../ method to fetch the current project path.

    Example: Project1 -- D:\projects

    src

    ConfigurationFiles

    Configuration.cfg

    Path="../src/ConfigurationFiles/Configuration.cfg"

    0 讨论(0)
  • 2020-12-04 08:38

    All the previous solutions seem to be overly complicated for what I think you need, and often didn't work for me. The following one-line command does what you want:

    import os
    ROOT_DIR = os.path.abspath(os.curdir)
    
    0 讨论(0)
  • 2020-12-04 08:40

    Just an example: I want to run runio.py from within helper1.py

    Project tree example:

    myproject_root
    - modules_dir/helpers_dir/helper1.py
    - tools_dir/runio.py
    

    Get project root:

    import os
    rootdir = os.path.dirname(os.path.realpath(__file__)).rsplit(os.sep, 2)[0]
    

    Build path to script:

    runme = os.path.join(rootdir, "tools_dir", "runio.py")
    execfile(runme)
    
    0 讨论(0)
  • 2020-12-04 08:41

    To get the path of the "root" module, you can use:

    import os
    import sys
    os.path.dirname(sys.modules['__main__'].__file__)
    

    But more interestingly if you have an config "object" in your top-most module you could -read- from it like so:

    app = sys.modules['__main__']
    stuff = app.config.somefunc()
    
    0 讨论(0)
提交回复
热议问题