2016-08-02 4 views
0

Wenn wir an einem ziemlich großen/komplexen Django-Projekt mit einem Team arbeiten, sehen wir gelegentlich einen Runserver-Absturz mit ValueError: embedded null byte. Wir starten runserver neu und es ist in Ordnung - entweder für ein paar Minuten oder ein paar Tage. Wir können kein Muster erkennen, was die Abstürze verursacht (scheint völlig zufällig). Zum Glück passiert es nur in der lokalen Entwicklung, nicht auf unseren Servern, aber ich mache mir Sorgen, dass es uns auf die Straße beißen wird.Mysterious "Embedded Nullbyte" -Fehler

Der Stack-Trace unten zeigt auf keinen Ort in unserem Code - scheint entweder von Django oder dem virtualenv selbst zu kommen.

Verwenden von Django 1.9.8, Python 3.5.0, auf El Capitan.

Ich sehe keine Möglichkeit, dies zu debuggen. Theorien?

Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/path/to/virtualenvs/ourproj/lib/python3.5/site-packages/django/core/management/__init__.py", line 353, in execute_from_command_line 
    utility.execute() 
    File "/path/to/virtualenvs/ourproj/lib/python3.5/site-packages/django/core/management/__init__.py", line 345, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/path/to/virtualenvs/ourproj/lib/python3.5/site-packages/django/core/management/base.py", line 348, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/path/to/virtualenvs/ourproj/lib/python3.5/site-packages/django/core/management/commands/runserver.py", line 54, in execute 
    super(Command, self).execute(*args, **options) 
    File "/path/to/virtualenvs/ourproj/lib/python3.5/site-packages/django/core/management/base.py", line 399, in execute 
    output = self.handle(*args, **options) 
    File "/path/to/virtualenvs/ourproj/lib/python3.5/site-packages/django/core/management/commands/runserver.py", line 93, in handle 
    self.run(**options) 
    File "/path/to/virtualenvs/ourproj/lib/python3.5/site-packages/django/core/management/commands/runserver.py", line 102, in run 
    autoreload.main(self.inner_run, None, options) 
    File "/path/to/virtualenvs/ourproj/lib/python3.5/site-packages/django/utils/autoreload.py", line 333, in main 
    reloader(wrapped_main_func, args, kwargs) 
    File "/path/to/virtualenvs/ourproj/lib/python3.5/site-packages/django/utils/autoreload.py", line 299, in python_reloader 
    reloader_thread() 
    File "/path/to/virtualenvs/ourproj/lib/python3.5/site-packages/django/utils/autoreload.py", line 275, in reloader_thread 
    change = fn() 
    File "/path/to/virtualenvs/ourproj/lib/python3.5/site-packages/django/utils/autoreload.py", line 204, in code_changed 
    for filename in gen_filenames(): 
    File "/path/to/virtualenvs/ourproj/lib/python3.5/site-packages/django/utils/autoreload.py", line 114, in gen_filenames 
    basedirs = [os.path.abspath(basedir) for basedir in basedirs 
    File "/path/to/virtualenvs/ourproj/lib/python3.5/site-packages/django/utils/autoreload.py", line 115, in <listcomp> 
    if os.path.isdir(basedir)] 
    File "/path/to/virtualenvs/ourproj/bin/../lib/python3.5/genericpath.py", line 42, in isdir 
    st = os.stat(s) 
ValueError: embedded null byte 

Antwort

2
  • Einer der AppConfig Objekte hat Null-Byte in seinem path Attribut.
  • Einer der LOCALE_PATHS hat Null-Byte.
  • Eine der Dateien ist in der "falschen" Kodierung, so behandelt Django etwas mit Null-Byte (z. B. AppConfig.path).
  • Eine der Dateien oder Verzeichnisse im Projektverzeichnis hat im Namen null Byte (\x00).
  • Anderer Grund.

autoreload.py lines zu diesem Problem verwandt. os.path.isdir() löst ValueError: embedded null byte aus, wenn sein Argument Nullbyte hat, e. G. os.path.isdir('foo\x00bar').

können Sie versuchen, autoreload.py zu bearbeiten, vorübergehend diese Zeilen auf Kommentar:

basedirs = [os.path.abspath(basedir) for basedir in basedirs 
      if os.path.isdir(basedir)] 

und fügen Sie diese:

temp_basedirs = [] 
for basedir in basedirs: 
    try: 
     if os.path.isdir(basedir): 
      temp_basedirs.append(os.path.abspath(basedir)) 
    except ValueError: 
     print(basedir) 
     raise 
basedirs = temp_basedirs 
+0

Interessant - so denken Sie, es ist ein Dateiname Problem ist, anstatt Code? – shacker

+0

@shacker Bearbeitet. – vd1

+0

Also habe ich das versucht, sowohl vom Projekt dir als auch vom virtualenv dir. Im virtualenv dir habe ich folgendes gefunden: 'finden. -name "[^ \ x00]" . ./Lib/python3.5/site-packages/kompressor/tests/statisch/css/url/2'. Ich pip deinstalliert und dann dieses Paket neu installiert, aber der Fund stellt immer noch auf, so werde ich den Entwickler dieses Pakets warnen. – shacker