2016-08-02 1 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 특성에 널 바이트를 갖는다.
  • LOCALE_PATHS 중 하나에 null 바이트가 있습니다.
  • 파일 중 하나가 "잘못된"인코딩이므로 장고는 무언가를 null 바이트로 처리합니다 (예 : AppConfig.path).
  • 프로젝트 디렉토리의 파일 또는 디렉토리 중 하나에 이름에 null 바이트 (\x00)가 있습니다.
  • 기타 이유.

autoreload.py lines이 문제와 관련이 있습니다. os.path.isdir()은 인수가 null 바이트 인 경우 ValueError: embedded null byte을 발생시킵니다. e. 지. 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

그래서 저는 프로젝트 dir과 virtualenv dir에서이 작업을 시도했습니다. virtualenv dir에서 나는 이것을 보았다 :'find. -name "[^ \ x00]" . ./lib/python3.5/site-packages/압축기/테스트/정적/CSS/URL/2'. 나는 제거한 다음 그 패키지를 다시 설치했지만 find는 여전히 그것을 나타 내기 때문에 패키지의 개발자에게 경고 할 것입니다. – shacker