当我运行以下代码时:
import argparse
from bottle import Bottle, run
app = Bottle()
@app.get('/')
def get_fn():
return 'Testing'
def command_line():
parser = argparse.ArgumentParser()
parser.add_argument('-k', '--sslkey', nargs='?', default=None,
help='SSL key file')
parser.add_argument('-c', '--sslcrt', nargs='?', default=None,
help='SSL certificate file')
return parser.parse_args()
if __name__ == "__main__":
args = command_line()
run(app=app, server='gunicorn',
host='0.0.0.0', port=8888,
debug=False, quiet=True,
keyfile=args.sslkey, certfile=args.sslcrt)
我遇到unrecognized argument
错误:
python3 ./tst.py --sslcrt ''
usage: tst.py [-h] [-v] [-c CONFIG] [-b ADDRESS] [--backlog INT] [-w INT]
[-k STRING] [--threads INT] [--worker-connections INT]
[--max-requests INT] [--max-requests-jitter INT] [-t INT]
[--graceful-timeout INT] [--keep-alive INT]
[--limit-request-line INT] [--limit-request-fields INT]
[--limit-request-field_size INT] [--reload]
[--reload-engine STRING] [--reload-extra-file FILES] [--spew]
[--check-config] [--preload] [--no-sendfile] [--reuse-port]
[--chdir CHDIR] [-D] [-e ENV] [-p FILE] [--worker-tmp-dir DIR]
[-u USER] [-g GROUP] [-m INT] [--initgroups]
[--forwarded-allow-ips STRING] [--access-logfile FILE]
[--disable-redirect-access-to-syslog]
[--access-logformat STRING] [--error-logfile FILE]
[--log-level LEVEL] [--capture-output] [--logger-class STRING]
[--log-config FILE] [--log-config-dict LOGCONFIG_DICT]
[--log-syslog-to SYSLOG_ADDR] [--log-syslog]
[--log-syslog-prefix SYSLOG_PREFIX]
[--log-syslog-facility SYSLOG_FACILITY] [-R]
[--statsd-host STATSD_ADDR] [--statsd-prefix STATSD_PREFIX]
[-n STRING] [--pythonpath STRING] [--paste STRING]
[--proxy-protocol] [--proxy-allow-from PROXY_ALLOW_IPS]
[--keyfile FILE] [--certfile FILE] [--ssl-version SSL_VERSION]
[--cert-reqs CERT_REQS] [--ca-certs FILE]
[--suppress-ragged-eofs] [--do-handshake-on-connect]
[--ciphers CIPHERS] [--paste-global CONF]
tst.py: error: unrecognized arguments: --sslcrt
如果我运行不带任何参数的相同脚本,它就可以正常工作。
目前,我的解决方法是在致电args
之前立即重置run()
:
import argparse, sys
from copy import copy
from bottle import Bottle, run
app = Bottle()
@app.get('/')
def get_fn():
return 'Testing'
def command_line():
parser = argparse.ArgumentParser()
parser.add_argument('-k', '--sslkey', nargs='?', default=None,
help='SSL key file')
parser.add_argument('-c', '--sslcrt', nargs='?', default=None,
help='SSL certificate file')
return parser.parse_args()
if __name__ == "__main__":
args = copy(command_line())
# must reset the args, otherwise gunicorn will go nuts
sys.argv = sys.argv[:1]
run(app=app, server='gunicorn',
host='0.0.0.0', port=8888,
debug=False, quiet=True,
keyfile=args.sslkey, certfile=args.sslcrt)
通过这种解决方法,我的脚本可以正常工作:
python3 ./tst.py --sslcrt ''
[2019-05-01 11:01:01 +0100] [29198] [INFO] Starting gunicorn 19.9.0
[2019-05-01 11:01:01 +0100] [29198] [INFO] Listening at: http://0.0.0.0:8888 (29198)
[2019-05-01 11:01:01 +0100] [29198] [INFO] Using worker: sync
[2019-05-01 11:01:01 +0100] [29239] [INFO] Booting worker with pid: 29239
是否有更明智的方法?