在python中启动SimpleHTTPServer

在python中启动SimpleHTTPServer,python,module,command-line-interface,main,Python,Module,Command Line Interface,Main,如果调用中的所有代码,有没有比复制/过去更好的更优雅/系统化/未来验证的方法 我正在将bash脚本转换为python。我们经常使用的两个命令是python-msimplehttpserver-YOUR_-PORT和python-mhttp.server-YOUR_-PORT 在2.x中翻译这个是相当干净的 : 我的代码用于模拟main: import SimpleHTTPServer SimpleHTTPServer.test() import argparse import http.ser

如果调用
中的所有代码,有没有比复制/过去更好的更优雅/系统化/未来验证的方法

我正在将bash脚本转换为python。我们经常使用的两个命令是
python-msimplehttpserver-YOUR_-PORT
python-mhttp.server-YOUR_-PORT

在2.x中翻译这个是相当干净的

:

我的代码用于模拟main:

import SimpleHTTPServer
SimpleHTTPServer.test()
import argparse
import http.server
from http.server import CGIHTTPRequestHandler, SimpleHTTPRequestHandler
parser = argparse.ArgumentParser()
parser.add_argument('--cgi', action='store_true',
                   help='Run as CGI Server')
parser.add_argument('--bind', '-b', default='', metavar='ADDRESS',
                    help='Specify alternate bind address '
                         '[default: all interfaces]')
parser.add_argument('port', action='store',
                    default=8000, type=int,
                    nargs='?',
                    help='Specify alternate port [default: 8000]')
args = parser.parse_args()
if args.cgi:
    handler_class = CGIHTTPRequestHandler
else:
    handler_class = SimpleHTTPRequestHandler
http.server.test(HandlerClass=handler_class, port=args.port, bind=args.bind)
在3.x中翻译此内容并不干净。

:

我的代码用于模拟main:

import SimpleHTTPServer
SimpleHTTPServer.test()
import argparse
import http.server
from http.server import CGIHTTPRequestHandler, SimpleHTTPRequestHandler
parser = argparse.ArgumentParser()
parser.add_argument('--cgi', action='store_true',
                   help='Run as CGI Server')
parser.add_argument('--bind', '-b', default='', metavar='ADDRESS',
                    help='Specify alternate bind address '
                         '[default: all interfaces]')
parser.add_argument('port', action='store',
                    default=8000, type=int,
                    nargs='?',
                    help='Specify alternate port [default: 8000]')
args = parser.parse_args()
if args.cgi:
    handler_class = CGIHTTPRequestHandler
else:
    handler_class = SimpleHTTPRequestHandler
http.server.test(HandlerClass=handler_class, port=args.port, bind=args.bind)

这看起来很可怕,我不确定这是否是最好的方法,但下面的代码似乎启动服务器没有太多困难:

import importlib
exec(compile(importlib.util.find_spec('http.server').loader.get_source(
    'http.server'), 'server.py', 'exec'), dict(__name__='__main__'))
更新1:启动
http.server
模块的下一个想法可能不是更好,但它直接利用
http.server
模块,而不必处理
importlib
模块

import http.server
exec(compile(http.server.__loader__.get_source(http.server.__name__),
             http.server.__file__, 'exec'), dict(__name__='__main__'))
当然,这可能只是意味着最好创建一个实用函数,该函数可以在我们想要运行模块的任何上下文中处理执行模块

import sys

nvl = lambda value, other: other if value is None else value

def exec_module(module, globals=None, locals=None):
    frame = sys._getframe(1)
    globals = nvl(globals, {})
    globals.update(frame.f_globals)
    locals = nvl(locals, {})
    locals.update(frame.f_locals)
    exec(compile(module.__loader__.get_source(module.__name__),
                 module.__file__, 'exec'), globals, locals)

# this is how you would use the code up above

import http.server

exec_module(http.server, dict(__name__='__main__'))
更新2:执行模块的
exec\u
功能可能更像以下功能,但由于某种原因,我没有注意到,它似乎没有按预期工作:

def exec_module(module, globals=None, locals=None):
    frame = sys._getframe(1)

    exec_globals = nvl(globals, {})
    copy_globals = exec_globals.copy()
    exec_globals.update(frame.f_globals)
    exec_globals.update(copy_globals)

    exec_locals = nvl(locals, {})
    copy_locals = exec_locals.copy()
    exec_locals.update(frame.f_locals)
    exec_locals.update(copy_locals)

    exec(compile(module.__loader__.get_source(module.__name__),
                 module.__file__, 'exec'), exec_globals, exec_locals)

这些变化考虑了两件事。首先,保留对传入的全局变量和局部变量的引用,以防调用方希望在函数运行后检查它们的状态。其次,调用者的全局变量和局部变量不能覆盖传入的全局变量和局部变量中已经设置的任何值。

oof。真聪明!但是,正如你所暗示的,我希望有一个更干净的解决方案。@StevenWexler有一个替代解决方案,完全避免了
importlib
模块。此外,第二个设计被细化为一个实用函数,它可能对任何用Python编写的模块都有用!