ИМ
Dec. 10, 2018, 12:55 a.m.

a bytes-like object is required, not 'str' в videokit

Python 3, django, videokit

Доброго времени суток. Нашел приложение для конвертации видео + celery что очень радует. Не радует только то что оно отказывается работать под python3

Трейсбек прикладываю:

  1. File "/home/django/venv/example/lib/python3.5/site-packages/django/core/handlers/exception.py", line 39, in inner
  2. response = get_response(request)
  3. File "/home/django/venv/example/lib/python3.5/site-packages/django/core/handlers/base.py", line 187, in _get_response
  4. response = self.process_exception_by_middleware(e, request)
  5. File "/home/django/venv/example/lib/python3.5/site-packages/django/core/handlers/base.py", line 185, in _get_response
  6. response = wrapped_callback(request, *callback_args, **callback_kwargs)
  7. File "/home/django/example/media/views.py", line 32, in item_create
  8. media_item.save()
  9. File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/base.py", line 796, in save
  10. force_update=force_update, update_fields=update_fields)
  11. File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/base.py", line 824, in save_base
  12. updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  13. File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/base.py", line 908, in _save_table
  14. result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  15. File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/base.py", line 947, in _do_insert
  16. using=using, raw=raw)
  17. File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method
  18. return getattr(self.get_queryset(), name)(*args, **kwargs)
  19. File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/query.py", line 1045, in _insert
  20. return query.get_compiler(using=using).execute_sql(return_id)
  21. File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1053, in execute_sql
  22. for sql, params in self.as_sql():
  23. File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1006, in as_sql
  24. for obj in self.query.objs
  25. File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1006, in <listcomp>
  26. for obj in self.query.objs
  27. File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1005, in <listcomp>
  28. [self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
  29. File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 955, in pre_save_val
  30. return field.pre_save(obj, add=True)
  31. File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/fields/files.py", line 292, in pre_save
  32. file.save(file.name, file, save=False)
  33. File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/fields/files.py", line 92, in save
  34. setattr(self.instance, self.field.name, self.name)
  35. File "/home/django/example/videokit/fields.py", line 198, in __set__
  36. self.field.update_dimension_fields(instance, force = True)
  37. File "/home/django/example/videokit/models.py", line 119, in update_dimension_fields
  38. width = file.width
  39. File "/home/django/example/videokit/fields.py", line 133, in _get_width
  40. return self._get_video_dimensions()[0]
  41. File "/home/django/example/videokit/fields.py", line 164, in _get_video_dimensions
  42. self._dimensions_cache = get_video_dimensions(self)
  43. File "/home/django/example/videokit/fields.py", line 25, in get_video_dimensions
  44. width = stdout.strip(' \t\n\r')
  45. TypeError: a bytes-like object is required, not 'str'
  46. [09/Dec/2018 18:34:05] "POST /item_create/ HTTP/1.1" 500 151897
  47.  

И функцию в которой ошибка:

  1. from django.conf import settings
  2. from django.core.files import File
  3. from django.db.models.fields.files import FieldFile
  4. from django.db.models.fields.files import FileDescriptor
  5.  
  6. from datetime import datetime
  7. import hashlib
  8. import os.path
  9. import subprocess
  10.  
  11. from videokit.apps import VideokitConfig
  12. from videokit.tasks import generate_video
  13.  
  14. def get_video_dimensions(file):
  15. path = os.path.join(settings.MEDIA_ROOT, file.name)
  16.  
  17. if os.path.isfile(path):
  18. try:
  19. process = subprocess.Popen(
  20. ['mediainfo', '--Inform=Video;%Width%', path],
  21. stdout = subprocess.PIPE, stderr = subprocess.PIPE)
  22.  
  23. stdout, stderr = process.communicate()
  24. if process.wait() == 0:
  25. width = int(stdout.strip(' \t\n\r'))
  26. else:
  27. return (0,0)
  28.  
  29. process = subprocess.Popen(
  30. ['mediainfo', '--Inform=Video;%Height%', path],
  31. stdout = subprocess.PIPE, stderr = subprocess.PIPE)
  32.  
  33. stdout, stderr = process.communicate()
  34. if process.wait() == 0:
  35. height = int(stdout.strip(' \t\n\r'))
  36. else:
  37. return (None, None)
  38.  
  39. return (width, height)
  40. except OSError:
  41. pass
  42.  
  43. return (None, None)
  44.  

Очень надеюсь на вашу помощь. Заранее благодарен.

2

Do you like it? Share on social networks!

4
Evgenii Legotckoi
  • Dec. 10, 2018, 2:43 p.m.

Добрый день!

Вам не нужно было сначала считать это всё из stdout?

  1. stdout.read().strip(' \t\n\r')'

    Автор кода не я. Решение нашел на одном забугорном ресурсе.

    1. width = int(stdout.decode('utf8').strip(' \t\n\r'))

    Все работает, но я не уверен что это правильное решение. Что скажете?

      Evgenii Legotckoi
      • Dec. 11, 2018, 12:12 a.m.
      • The answer was marked as a solution.

      Если не ошибаюсь, то decode должен возвращать str в с декодированием из utf8 в данном случае, а потом вы вырезаете лишние элементы, так что всё правильно на мой взгляд. Ну и напоследок преобразуете строку в int. В принципе всё верно. Не вижу причин, чтобы данный код был неправильным.

        Спасибо за пояснение.

          Comments

          Only authorized users can post comments.
          Please, Log in or Sign up
          • Last comments
          • AK
            April 1, 2025, 11:41 a.m.
            Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
          • Evgenii Legotckoi
            March 9, 2025, 9:02 p.m.
            К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
          • VP
            March 9, 2025, 4:14 p.m.
            Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
          • ИМ
            Nov. 22, 2024, 9:51 p.m.
            Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
          • Evgenii Legotckoi
            Oct. 31, 2024, 11:37 p.m.
            Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup