2

我正在尝试在命令行上运行一个脚本,该脚本使用以下命令使用模型:

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

我究竟做错了什么?

编辑:根据我的研究,我只找到了“将 -M 添加到您的命令”的解决方案,但我已经这样做了,但它仍然不起作用。

edit2:我的 db.py 中有 db = DAL('sqlite://storage.sqlite') 所以它应该被加载

4

1 回答 1

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在模块中定义了对象,请不要在顶层定义它——在函数或类中定义它。

有关更多详细信息,请参阅有关模块和current.

于 2012-08-15T02:38:17.823 回答