在 web.py 中打开和关闭文件的位置
where to open and close file in web.py
当我终止程序并意识到它从未正确关闭时,数据文件已损坏。
它不被损坏是非常关键的。所以我添加了一条语句来关闭文件。
现在,文件似乎被打开了两次,然后又被关闭了。一个操作太多了。中间当然有很多读写操作,但它应该只打开和关闭文件一次。
这是我对标准化 web.py 模板所做的:
import web
import pandas as pd
store = pd.HDFStore('data_file.h5')
urls = (
'/', 'index'
)
class index:
def __init__(self):
self.__df = store['df']
def GET(self):
# several read-write, and modify operations on self.__df
return "Hello, world!"
if __name__ == "__main__":
try:
app = web.application(urls, globals())
app.run()
finally:
store.close()
现在,如果我将打开商店的行移到底部的 try
语句中,它会抱怨,因为它编译了 class 但我找不到变量 store
。
我尝试在顶部用 None
初始化 store
,但它也没有用。然后我尝试将该行放在函数的顶部并从底部调用它,但是,这并没有将它纳入范围。
我正在考虑将其设为 global
变量,这可能会奏效,这是正确的方法吗?
参见 。正如那里提到的那样,避免使用全局变量,因为它们不会按照您认为的那样做... app.py 运行两次,一次在启动时,第二次在 web.appplication(urls, globals())
内。如果您在 web.applications() 调用中设置 autoreload=False
,它不会加载文件两次。
另一个解决方案是将您的 store
附加到 web.config
,这是全球可用的。
if __name__ == "__main__":
try:
web.config.store = pd.HDFStore('data_file.h5')
app = web.application(urls, globals())
app.run()
finally:
web.config.store.close()
...并在您的 __init__
中引用该全局变量
class index:
def __init__(self):
self.__df = web.config.store['df']
当我终止程序并意识到它从未正确关闭时,数据文件已损坏。
它不被损坏是非常关键的。所以我添加了一条语句来关闭文件。
现在,文件似乎被打开了两次,然后又被关闭了。一个操作太多了。中间当然有很多读写操作,但它应该只打开和关闭文件一次。
这是我对标准化 web.py 模板所做的:
import web
import pandas as pd
store = pd.HDFStore('data_file.h5')
urls = (
'/', 'index'
)
class index:
def __init__(self):
self.__df = store['df']
def GET(self):
# several read-write, and modify operations on self.__df
return "Hello, world!"
if __name__ == "__main__":
try:
app = web.application(urls, globals())
app.run()
finally:
store.close()
现在,如果我将打开商店的行移到底部的 try
语句中,它会抱怨,因为它编译了 class 但我找不到变量 store
。
我尝试在顶部用 None
初始化 store
,但它也没有用。然后我尝试将该行放在函数的顶部并从底部调用它,但是,这并没有将它纳入范围。
我正在考虑将其设为 global
变量,这可能会奏效,这是正确的方法吗?
参见 web.appplication(urls, globals())
内。如果您在 web.applications() 调用中设置 autoreload=False
,它不会加载文件两次。
另一个解决方案是将您的 store
附加到 web.config
,这是全球可用的。
if __name__ == "__main__":
try:
web.config.store = pd.HDFStore('data_file.h5')
app = web.application(urls, globals())
app.run()
finally:
web.config.store.close()
...并在您的 __init__
class index:
def __init__(self):
self.__df = web.config.store['df']