UnboundLocalError:在syncdb时,局部变量'full_path'在赋值前被引用

0 投票
1 回答
822 浏览
提问于 2025-04-17 15:58

这里有一个类似的问题,但它没有解决我今天遇到的具体情况。

我在使用openSUSE系统时,进行syncdb操作时遇到了一个难以理解的错误。我把我的发现分享出来,希望能帮助到遇到相似问题的其他人。

> python manage.py syncdb
Creating tables ...
Installing custom SQL ...
Installing indexes ...
Traceback (most recent call last):
  File "manage.py", line 14, in <module>
    execute_manager(settings)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py",     line 459, in execute_manager
    utility.execute()
  File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py",     line 382, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 371, in handle
    return self.handle_noargs(**options)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/commands/syncdb.py", line 164, in handle_noargs
    call_command('loaddata', 'initial_data', verbosity=verbosity, database=db)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 150, in call_command
    return klass.execute(*args, **defaults)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/commands/loaddata.py", line 239, in handle
    (full_path, ''.join(traceback.format_exception(sys.exc_type,
UnboundLocalError: local variable 'full_path' referenced before assignment

1 个回答

2

这个错误看起来不太好(本来应该被捕捉到,并且应该给用户返回一个完整的错误信息),但这通常是因为你系统上缺少一些默认或可选的序列化模块。

举个例子,如果在你的settings.py文件中,在SERIALIZATION_MODULES这个字典里提到了wadofstuff.django.serializers.json这个序列化模块,但它没有被安装,那么就会出现这个错误。

你可以通过以下方式来安装它:

pip install wadofstuff-django-serializers

在openSUSE系统上,另一个可能的原因是python-xml模块没有被安装(它并不包含在python-base包里),所以可能会导致xml.sax.saxutils的导入失败。

在这种情况下,你可以安装python-xml,比如这样做:

sudo zypper in python-xml

这样应该就能正常工作了。

如果这样还是不行,你可以运行pdb来设置一个断点,看看哪里出错了。例如:

> python -m pdb manage.py syncdb
> manage.py(2)<module>() -> from django.core.management import execute_manager
(Pdb) b /usr/local/lib/python2.7/site-packages/django/core/management/commands/loaddata.py:110
Breakpoint 1 at /usr/local/lib/python2.7/site-packages/django/core/management/commands/loaddata.py:110
(Pdb) c
Creating tables ...
Installing custom SQL ...
Installing indexes ...
> /usr/local/lib/python2.7/site-packages/django/core/management/commands/loaddata.py(110)handle()
-> for fixture_label in fixture_labels:
(Pdb) n
> /usr/local/lib/python2.7/site-packages/django/core/management/commands/loaddata.py(111)handle()
-> parts = fixture_label.split('.')

到时候,你会清楚地看到错误出现的地方:

ImportError: 'No module named xml.sax.saxutils'

撰写回答