我喜欢Python的SimpleHTTPServer的易用性,但......
我想从我称之为“假目录”的地方启动它 - 也就是说,一个目录只存在于服务器的角度(实际上并不存在于计算机上),并且不再存在当运行服务器的python进程停止时。我也可以使用临时目录,但我想保证此目录被删除(因此我不会在每次运行时累积文件而必须考虑手动擦除它们)。
有谁知道最好的方法是什么?
答案 0 :(得分:1)
我会通过使用内存中的sqlite数据库来完成此操作。您可以获得sql数据库的所有好处(关系,可搜索性等),但它只存在于进程的整个生命周期中。
您可以使用模拟完整POSIX文件系统的程序包libsqlfs,也可以使用几个简单的表来创建自己的目录和文件。这取决于您想要模拟实际文件系统的彻底程度。
答案 1 :(得分:1)
您可以使用TemporaryDirectory或mkdtemp并从该目录中提供服务器服务。使用第一种方法,如果用作上下文管理器,则可以自动清理。
或者,您可以尝试在容器系统中运行所有内容,例如Docker。这样你就可以隔离容器内的所有操作,并查看文件系统,只允许你想要的修改。然而,它是一种重型武器。
答案 2 :(得分:1)
以下是使用mkdtemp
可以实现的内容的摘要。如果python进程被杀死,它不会删除文件。也许信号处理程序可以完成这项工作。
import SimpleHTTPServer
import tempfile
import os
import shutil
class CustomHTTPServer():
pass
if __name__ == '__main__':
tmpdir = tempfile.mkdtemp()
try:
print "Serving files under %s" % tmpdir
os.chdir(tmpdir)
SimpleHTTPServer.test()
except Exception:
pass
finally:
shutil.rmtree(tmpdir)
你可以使用python -m CustomHTTPServer
召唤。
答案 3 :(得分:0)
您可以从SimpleHTTPServer继承并覆盖方法 list_directory 和 translate_path ,但如果您真的不介意将其转储到光盘,则可以将自己设为临时目录使用shutil处理目录删除的上下文管理器:
from tempfile import mkdtemp
import shutil
class TempDir(object):
def __init__(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs
def __enter__(self):
self.tempdir = mkdtemp(*self.args, **self.kwargs)
return self.tempdir
def __exit__(self, *args):
return shutil.rmtree(self.tempdir)
然后使用SimpleHTTPServer服务。
from SimpleHTTPServer import test
import os
with TempDir(prefix="server") as dirname:
os.chdir(dirname)
try:
test()
except KeyboardInterrupt:
pass