Running a Python script outside of Django

前端 未结 7 1910
后悔当初
后悔当初 2021-01-30 03:22

I have a script which uses the Django ORM features, amongst other external libraries, that I want to run outside of Django (that is, executed from the command-line).

Edi

相关标签:
7条回答
  • 2021-01-30 03:42
    from <Project path>          import settings          #your project settings file
    from django.core.management  import setup_environ     #environment setup function
    
    setup_environ(settings)
    
    #Rest of your django imports and code go here
    
    0 讨论(0)
  • 2021-01-30 03:42

    I like to add the following command to my projects:

    myproject/management/commands/run-script.py:

    from django.core.management.base import BaseCommand, CommandError
    
    import imp
    import sys
    
    
    class Command(BaseCommand):
    
        help = """Run a non-django script with django settings."""
        args = "<path_to_script.py> [<script_args>...]"
    
        def handle(self, *args, **options):
            if len(args) == 0:
                raise CommandError("Path to script to run is required")
            sys.argv = list(args)
            imp.load_source("__main__", args[0])
    

    Then, I can run custom scripts, e.g:

    ./manage.py run-script /path/to/myscript.py --opt=value arg1 arg2
    
    0 讨论(0)
  • Note that the suggestions around importing settings and using setup_environ have been deprecated with Django 1.4.

    There's a thread on the Django Github describing why this was done.

    There are still some other options out there but many of them seem hackish to me. My preferred method is often to include the scripted function as an extended command of manage.py

    0 讨论(0)
  • 2021-01-30 03:55

    All you need is importable settings and properly set python path. In the most raw form this can be done by setting up appropriate environment variables, like:

    $ DJANGO_SETTINGS_MODULE=myproject.settings PYTHONPATH=$HOME/djangoprojects python myscript.py
    

    There are other ways, like calling settings.configure() and already mentioned setup_environ() described by James Bennett in some blog post.

    0 讨论(0)
  • 2021-01-30 04:02

    Use runscript from django-extensions: python manage.py runscript <my_script>

    In order to do this, you need to:

    1. pip install django-extensions
    2. Create a directory called scripts. This can be located in your root directory, or in a specific app.
    3. Initialize the directory with a blank init file:

      touch scripts/__init__.py

    4. Place your script in this directory, and include a run() function. Example:

      #hello.py
      
      def hello():
          return "Hello, World"
      
      def run():
          print hello()
      
    5. Run the script with python manage.py runscript hello

    Refer to docs and helpful blog post for more details.

    0 讨论(0)
  • 2021-01-30 04:08

    The easiest way to do this is to set up your script as a manage.py subcommand. It's quite easy to do:

    from django.core.management.base import NoArgsCommand, make_option
    
    class Command(NoArgsCommand):
    
        help = "Whatever you want to print here"
    
        option_list = NoArgsCommand.option_list + (
            make_option('--verbose', action='store_true'),
        )
    
        def handle_noargs(self, **options):
            ... call your script here ...
    

    Put this in a file, in any of your apps under management/commands/yourcommand.py (with empty __init__.py files in each) and now you can call your script with ./manage.py yourcommand.

    If you're using Django 1.10 or greater NoArgsCommand has been deprecated. Use BaseCommand instead. https://stackoverflow.com/a/45172236/6022521

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