clean_pyc.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. # -*- coding: utf-8 -*-
  2. import fnmatch
  3. import os
  4. from os.path import join as _j
  5. from django.conf import settings
  6. from django.core.management.base import BaseCommand, CommandError
  7. from django_extensions.management.utils import signalcommand
  8. class Command(BaseCommand):
  9. help = "Removes all python bytecode compiled files from the project."
  10. requires_system_checks = False
  11. def add_arguments(self, parser):
  12. parser.add_argument(
  13. '--optimize', '-o', '-O', action='store_true',
  14. dest='optimize', default=False,
  15. help='Remove optimized python bytecode files'
  16. )
  17. parser.add_argument(
  18. '--path', '-p', action='store', dest='path',
  19. help='Specify path to recurse into'
  20. )
  21. @signalcommand
  22. def handle(self, *args, **options):
  23. project_root = options.get("path", getattr(settings, 'BASE_DIR', None))
  24. if not project_root:
  25. project_root = getattr(settings, 'BASE_DIR', None)
  26. verbosity = options["verbosity"]
  27. if not project_root:
  28. raise CommandError("No --path specified and settings.py does not contain BASE_DIR")
  29. exts = options["optimize"] and "*.py[co]" or "*.pyc"
  30. for root, dirs, filenames in os.walk(project_root):
  31. for filename in fnmatch.filter(filenames, exts):
  32. full_path = _j(root, filename)
  33. if verbosity > 1:
  34. self.stdout.write("%s\n" % full_path)
  35. os.remove(full_path)