Django运行一次性自定义脚本时xlrd未定义错误的排查与解决
解决Django Shell执行自定义脚本时的xlrd未定义/文件找不到问题
问题场景
我需要在Django项目里运行一个一次性脚本,用来读取Excel文件并写入数据库,执行命令:
python manage.py shell < polygon/run.py
时遇到了NameError: name 'xlrd' is not defined的报错,排查后发现实际是文件路径的问题。
报错详情
Error: File "manage.py", line 15, in <module> execute_from_command_line(sys.argv) File "/home/jurabek/Project/hrm/.venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line utility.execute() File "/home/jurabek/Project/hrm/.venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/jurabek/Project/hrm/.venv/lib/python3.7/site-packages/django/core/management/base.py", line 323, in run_from_argv self.execute(*args, **cmd_options) File "/home/jurabek/Project/hrm/.venv/lib/python3.7/site-packages/django/core/management/base.py", line 364, in execute output = self.handle(*args, **options) File "/home/jurabek/Project/hrm/.venv/lib/python3.7/site-packages/django/core/management/commands/shell.py", line 92, in handle exec(sys.stdin.read()) File "<string>", line 17, in <module> File "<string>", line 10, in run NameError: name 'xlrd' is not defined
我的初始脚本代码
polygon/run.py的初始代码:
from apps import xlrd loc = ('users.xlsx') def run(): workbook = xlrd.open_workbook(loc) sheet = workbook.sheet_by_index(0) print(sheet.cell_value(0, 0)) run()
项目目录结构
.venv apps/ -- 所有业务应用 polygon/ run.py manage.py settings/
问题排查与解决方法
先修正xlrd的导入错误:
初始代码里from apps import xlrd是错误的,xlrd是第三方依赖库,并非apps下的模块,应该改为:import xlrd不过这一步只是修正了语法问题,执行后依然会报错,因为还有更核心的文件路径问题。
核心问题:文件路径不匹配
当通过manage.py shell执行脚本时,程序的工作目录是项目根目录(也就是manage.py所在的目录),而我的users.xlsx文件实际是放在polygon目录下的,直接写users.xlsx会导致程序在根目录找不到这个文件,进而触发后续的连锁错误(看起来像是xlrd未定义,但实际是文件找不到引发的问题)。最终解决方案
将文件路径修改为相对于项目根目录的路径:import xlrd # 修正文件路径为polygon目录下的文件 loc = ('polygon/users.xlsx') def run(): workbook = xlrd.open_workbook(loc) sheet = workbook.sheet_by_index(0) print(sheet.cell_value(0, 0)) run()再次执行
python manage.py shell < polygon/run.py,脚本就能正常读取Excel文件并运行了。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

