在 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']