Python SimpleHTTPServer提供子目录

时间:2016-07-13 21:39:07

标签: python simplehttpserver

是否可以使用SimpleHTTPServer服务子目录而不是当前目录?

我在命令行中使用它,如:

python -m SimpleHTTPServer 5002

我想使用它的原因是我有一个target文件夹,我不时删除它,并由我的工具重新生成。但是当我这样做时,我也需要重启SimpleHTTPServer。我认为从父存储库提供它将允许我不重新启动它。

2 个答案:

答案 0 :(得分:1)

好吧,要提供父目录,只需在运行Python脚本(python -m SimpleHTTPServer 5002)之前更改当前工作目录。

您可以编写自己的脚本,例如:'my_server.py':

import SimpleHTTPServer
import os


def main():
    pwd = os.getcwd()
    try:
        os.chdir("..")  # or any path you like
        SimpleHTTPServer.test()
    finally:
        os.chdir(pwd)


if __name__ == "__main__":
    main()

然后运行'my_server.py':

python -m my_server 5002

答案 1 :(得分:0)

如果要从Shell调用它,则可以使用Shell功能并执行:

对于Python 2:

pushd /path/you/want/to/serve; python -m SimpleHTTPServer; popd

对于Python 3.6,您甚至不需要这样做。
http.server有一个目录参数,只需这样做:

python3 -m http.server -d /path/you/want/to/serve

但是,如果要以编程方式调用它,则Andy Hayden在“ How to run a http server which serves a specific path?”上提出的解决方案似乎更合适。
(它不太“ hacky” /取决于副作用,而是使用类构造函数。)

是这样的:

import http.server
import socketserver

PORT = 8000
DIRECTORY = "web"


class Handler(http.server.SimpleHTTPRequestHandler):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, directory=DIRECTORY, **kwargs)


with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

上面的代码适用于Python> = 3.6
对于3.5以下的Python,TCPServer的基类没有可用的contextmanager协议,但这仅意味着您需要更改with语句并将其转换为简单的赋值:

httpd = socketserver.TCPServer(("", PORT), Handler)

为此Anthony Sottile获得last detail的积分。