我已经用Tornado建立了一个Web服务器,我的客户想自己托管它。 我的公司想阻止他们访问代码,所以我在想是否有办法为Web服务器构建二进制可执行文件。 因此,他们所需要做的只是像sh ./server这样的简单sh ./server 。
该Web服务器可执行文件将需要保留,并且端口配置是可选的。 为了简洁起见,我们只考虑性能。
我尝试使用PyInstaller,但是它将所有代码输出到dist文件夹中,这并不理想。 有任何想法吗?
我的代码看起来像这样
#!/usr/bin/python3
import signal
from time import time
from math import floor
from configs import configs
from handlers import handlers
from functools import partial
from tornado.ioloop import IOLoop
from tornado.web import Application, url
from tornado.httpserver import HTTPServer
class Server(Application):
def __init__(self, **kwargs):
kwargs["handlers"] = handlers
for k, v in kwargs.items():
setattr(self, k, v)
super(Server, self).__init__(**kwargs)
def signal_handler(self, server, signal, frame):
io_loop = IOLoop.instance()
def stop_loop(deadline):
now = time()
if now < deadline:
print("Shutting down in {}s".format(floor(deadline - now)))
io_loop.add_timeout(now + 1, stop_loop, deadline)
else:
io_loop.stop()
print("Server shutdown gracefully!")
def shutdown():
print("Stopping http server")
server.stop()
print("Shutting down in {}s".format(self.waitSecShutdown))
stop_loop(time() + self.waitSecShutdown)
print("Caught signal: {}".format(signal))
io_loop.add_callback_from_signal(shutdown)
if __name__ == "__main__":
app = Server(**configs)
server = HTTPServer(app)
server.listen(port=8080)
signal.signal(signal.SIGTERM, partial(app.signal_handler, server))
signal.signal(signal.SIGINT, partial(app.signal_handler, server))
IOLoop.instance().start()