我尝试在命令行运行脚本,该脚本使用带有以下命令的模型:
c:\web2py>python web2py.py -M -N -S automate -R applications/automate/modules/eventserver.py
但我一直收到错误:
web2py Web Framework
Created by Massimo Di Pierro, Copyright 2007-2011
Version 1.99.7 (2012-03-04 22:12:08) stable
Database drivers available: SQLite3, pymysql, pg8000, IMAP
Traceback (most recent call last):
File "c:\web2py\gluon\shell.py", line 206, in run
execfile(startfile, _env)
File "applications/automate/modules/eventserver.py", line 6, in <module>
deviceHandler = devicehandler.DeviceHandler()
File "applications\automate\modules\devicehandler.py", line 10, in __init__
self.devices = self.getActiveDevices()
File "applications\automate\modules\devicehandler.py", line 18, in getActiveDe
vices
print db
NameError: global name 'db' is not defined
我做错了什么?
编辑:从我的研究中我只发现了解决方案&#34;将-M添加到您的命令&#34;但是我已经做到了,但它仍然没有用。
edit2:我的db.py中有db = DAL(&#39; sqlite://storage.sqlite')所以它应该加载
答案 0 :(得分:8)
edit2:我的db.py中有db = DAL('sqlite://storage.sqlite'),所以它应该加载
假设db.py位于/ models文件夹中,那么在此处创建的db
对象将在以后执行的模型文件以及控制器和视图中可用,但它不会在您使用的模块中可用进口。相反,您必须将db
对象传递给模块中的函数或类。另一个选项是将db
对象添加到current
线程本地对象,然后可以在模块中导入和访问该对象:
在/models/db.py中:
from gluon import current
db = DAL('sqlite://storage.sqlite')
current.db = db
在/modules/eventserver.py中:
from gluon import current
def somefunction():
db = current.db
[do something with db]
注意,如果您确实在模块中定义了db
对象,请不要在顶层定义它 - 在函数或类中定义它。
有关详情,请参阅modules and current
上的图书部分。