2016-08-02 11 views
0

チームとかなり大規模/複雑なDjangoプロジェクトで作業しているときに、ValueError: embedded null byteでrunserverクラッシュが表示されることがあります。 runserverを再起動すると、数分か数日かかっても問題ありません。クラッシュの原因となるパターンは検出されません(完全にランダムなようです)。幸運なことに、私たちのサーバーではなく、地元の開発でしか起こっていませんが、私はそれが私たちを道に押しつぶすのではないかと心配しています。不思議な "埋め込みヌルバイト"エラー

以下のスタックトレースは、私たちのコード内のどの場所も指していません - Djangoまたはvirtualenv自体から来ているようです。

エルキャピタンでDjango 1.9.8、Python 3.5.0を使用しています。

これをデバッグする方法はありません。理論? AppConfigオブジェクトの

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 

答えて

2
  • 一つは、そのpath属性にNULLバイトを持っています。
  • LOCALE_PATHSの1つにnullバイトがあります。
  • ファイルの1つが「間違った」エンコーディングになっているため、Djangoは何かをヌルバイト(たとえば、AppConfig.path)と扱います。
  • プロジェクトディレクトリ内のファイルまたはディレクトリの1つに、その名前にヌルバイト(\x00)があります。
  • その他の理由。

autoreload.py linesこの問題に関連する。 os.path.isdir()引数がヌルバイトの場合はValueError: embedded null byteを返します。 g。 os.path.isdir('foo\x00bar')

あなたは一時的にこれらの行をコメントアウトし、autoreload.pyを編集しようとすることができます

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

をして、これを追加します。

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

興味深い - あなたはそれがむしろコードよりも、ファイル名の問題だと思いますか? – shacker

+0

@shacker編集されました。 – vd1

+0

私はこれを、プロジェクトディレクトリとvirtualenvディレクトリの両方から試しました。 virtualenv dirでは、私はこれを見つけました: 'find。 -name "[^ \ x00]" 。 。/ lib/python3.5/site-packages/compress/tests/static/css/url/2'。アンインストールしてからそのパッケージを再インストールしますが、まだ見つかっていないので、そのパッケージの開発者に警告します。 – shacker