python-daemon + argparse?

时间:2017-11-30 15:15:40

标签: python argparse python-daemon

我制作了一个需要运行几个参数的脚本。最初它可以使用参数'auto'自动运行,但我正在尝试守护它,因此它将运行带有指定参数的脚本作为守护进程。问题是python-daemon和argparse在决定谁解析什么时似乎并不相处。

parser = argparse.ArgumentParser(usage='pyfilter.py <file> <options> <actions>')
parser.add_argument('file', help='blacklist file containing IPs', type=str)

subparsers = parser.add_subparsers(help='help', dest='action')

parser_update = subparsers.add_parser('update', help='update help')
parser_update.add_argument('-c', '--check', help="check IPs for abuse reports", dest="check", type=str, nargs=1)

parser_blacklist = subparsers.add_parser('blacklist', help='create iptables rules for malicious IPs specified'
                                                           'in the provided file')
parser_clear = subparsers.add_parser('clear', help='clear iptables')

parser_auto = subparsers.add_parser('auto', help='automatically run update and blacklist on a loop')
parser_auto.add_argument('-i', '--interval', help='specify the loop interval', dest='interval', type=int, nargs=1)
parser_auto.add_argument('-c', '--check', help="check IPs for abuse reports", dest="check", type=str, nargs=1)

parser.add_argument('-p', '--port', help='specify the port to block', type=int)
parser.add_argument('-v', '--verbose', help='write output to screen', nargs=1)
args = parser.parse_args()

. . .

class pyfilterDaemon():
    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path = '/tmp/pyfilter.pid'
        self.pidfile_timeout = 5

    def run(self):
        while True:
            update()
            blacklist()
            time.sleep(interval)
. . .

def main():
    #handle()
    d = pyfilterDaemon()
    daemon_runner = runner.DaemonRunner(d)
    daemon_runner.start()

以下是我试图让这项工作的命令:

root@tfof:~# ./pyfilter.py start
ERROR: File 'start' not found  # argparse parsed 'start' accidentally

root@tfof:~# ./pyfilter.py /etc/blacklist.lst -v yes auto
usage: checkfilter.py stop|restart|start  # now the argparse arguments are satisfied, but python-daemon is looking for its argument

root@tfof:~# ./pyfilter.py /etc/blacklist.lst -v yes auto start
usage: pyfilter.py <file> <options> <actions>
pyfilter.py: error: unrecognized arguments: start  # argparse is trying to parse 'start'

是否可以将'start'参数传递给python-daemon或其他东西?或者,如果我可以摆脱argparsing它会没事,但'file'是必须的。

1 个答案:

答案 0 :(得分:0)

Argparse默认从sys.argv获取参数(参见here)。 你在这里看到的行为正在发生,这并不奇怪, 因为你只是使用默认参数调用parse_args函数。 您只需传递要解析的内容,而不是sys.argv。

有关示例,请参阅this question

因此,消耗python-deamon所需的任何内容,然后使用argparse解析剩余的args。