Get absolute path of django app

后端 未结 6 2035
一整个雨季
一整个雨季 2021-02-03 20:09

I am writing a unit test that needs to access an image file that I put in \"fixtures\" directory right under my django app directory. I want to open up this image file in my tes

相关标签:
6条回答
  • 2021-02-03 20:44

    Keep in mind that appname.__path__ is a list:

    import appname
    APP_ROOT = os.path.abspath(appname.__path__[0])
    file_path = os.path.join(APP_ROOT, "some_file.txt")
    
    
    0 讨论(0)
  • 2021-02-03 20:48

    Python3.4 and above comes with standard library pathlib.

    from pathlib import Path
    import appmodule
    
    pth = Path(appmodule.__file__).parent / 'fixtures'
    if pth.exists():
         "Your code here"
    

    parent will give you the path of your app directory, and / will append fixtures as path.

    0 讨论(0)
  • 2021-02-03 20:51

    Normally, this is what I add in my settings.py file so I can reference the project root.

    import os.path
    
    PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
    

    This method will get the directory of any python file.

    0 讨论(0)
  • 2021-02-03 20:52

    So the accepted answer usually works fine. However, for

    • namespace packages with multiple paths, or
    • apps which explicitly configure their paths in the config,

    their intended path may not agree with the __file__ attribute of the module.

    Django (1.7+) provides the AppConfig.path attribute - which I think is clearer even in simple cases, and which covers these edge cases too.

    The application docs tell you how to get the AppConfig object. So to get AppConfig and print the path from it:

    from django.apps import apps
    print(apps.get_app_config('app_label').path)
    

    Edit: Altered example for how to use get_app_config to remove dots, which seems to have been confusing. Here are the docs for reference.

    0 讨论(0)
  • 2021-02-03 21:08

    Python modules (including Django apps) have a __file__ attribute that tells you the location of their __init__.py file on the filesystem, so

    import appname
    pth = os.path.dirname(appname.__file__)
    

    should do what you want.

    In usual circumstances, os.path.absname(appname.__path__[0]), but it's possible for apps to change that if they want to import files in a weird way.

    (I do always do PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) in my settings.py, though -- makes it easy for the various settings that need to be absolute paths.)

    0 讨论(0)
  • 2021-02-03 21:08

    În newer versions of Django (I don't know when it started, I assume it's there for many years now), the default settingy.py contains an entry

    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    

    which you can use by importing the settings file like this

    import os    
    from my_project_name.settings import BASE_DIR
    
    os.path.join(BASE_DIR, ...)
    
    0 讨论(0)
提交回复
热议问题