Python SimpleHTTPServer 服务一个子目录
Python SimpleHTTPServer serve a subdirectory
是否可以使用 SimpleHTTPServer 提供子目录而不是当前目录?
我像这样从命令行使用它:
python -m SimpleHTTPServer 5002
我想使用它的原因是我有一个 target
文件夹,我不时删除它并由我的工具重新生成。但是,当我这样做时,我还需要重新启动 SimpleHTTPServer。我认为从父存储库提供服务将允许我不重新启动它。
好吧,要为父目录提供服务,只需在 运行 启用您的 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
如果您从 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 on "”提出的解决方案似乎更合适。
(它较少 'hacky'/ 依赖于副作用,而是使用 class 构造函数。)
是这样的:
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
对于 Python 到 3.5,没有可用于 TCPServer 的基础 class 的上下文管理器协议,但这仅意味着您需要更改 with
语句并将其转换为普通赋值:
httpd = socketserver.TCPServer(("", PORT), Handler)
感谢 Anthony Sottile for this 。
是否可以使用 SimpleHTTPServer 提供子目录而不是当前目录?
我像这样从命令行使用它:
python -m SimpleHTTPServer 5002
我想使用它的原因是我有一个 target
文件夹,我不时删除它并由我的工具重新生成。但是,当我这样做时,我还需要重新启动 SimpleHTTPServer。我认为从父存储库提供服务将允许我不重新启动它。
好吧,要为父目录提供服务,只需在 运行 启用您的 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
如果您从 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 on "
(它较少 'hacky'/ 依赖于副作用,而是使用 class 构造函数。)
是这样的:
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
对于 Python 到 3.5,没有可用于 TCPServer 的基础 class 的上下文管理器协议,但这仅意味着您需要更改 with
语句并将其转换为普通赋值:
httpd = socketserver.TCPServer(("", PORT), Handler)
感谢 Anthony Sottile for this