Python使用不打印

iNo*_*oob 1 python

我正在创建我的第一个python"应用程序",我有args或缺乏问题.如果我执行没有参数的脚本id期望一条消息说明使用情况,而是我得到以下错误

错误

unknown@ubuntu:~$ ./attack.py
Traceback (most recent call last):
File "./attack.py", line 60, in <module>
main(sys.argv[1:])
File "./attack.py", line 57, in main
print fread(FWORD)
File "./attack.py", line 19, in fread
flist = open(FWORD).readlines()
TypeError: coercing to Unicode: need string or buffer, NoneType found
Run Code Online (Sandbox Code Playgroud)

#!/usr/bin/python


import sys, getopt, socket, fileinput, traceback
from Queue import Queue
from threading import Thread


def usage():
    print "-h --help: help\n"
    print "-f --file: File to read potential Sub-domains from.\n"
    print "-p --PROXY: PROXY address and port. e.g http://192.168.1.64:8080\n"
    print "-d --DOMAIN: DOMAIN to bruteforce.\n"
    print "-t --thread: Thread count.\n"
    print "-e: Turn debug on.\n"
    sys.exit()

def fread(FWORD, *args):
    flist = open(FWORD).readlines()
    return flist

#def addcheck(fcontent):



def main(argv):
    PROXY = None
    DOMAIN = None
    FWORD= None
    try:
            opts, argv =getopt.getopt(argv, "h:f:p:d:t:e",["help", "file=", "PROXY=", "DOMAIN=", "thread="])

    except getopt.GetoptError as err:
            print str(err)
            usage()
            sys.exit(2)

    for opt, arg in opts:
            if opt in ("-h", "--help"):
                    usage()
                    sys.exit()
            elif opt in ("-f", "--file"):
                    FWORD = arg
            elif opt in ("-p", "--PROXY"):
                    PROXY = arg
            elif opt in ("-d", "--DOMAIN"):
                    DOMAIN = arg
            elif opt in ("-t", "--thread"):
                    thread = arg
            elif opt in '-e':
                    global _debug
                    _debug = 1
            else:
                    usage()
                    sys.exit()

    print fread(FWORD)

if __name__ == "__main__":
    main(sys.argv[1:])
Run Code Online (Sandbox Code Playgroud)

好的,感谢所有的评论和指示.ZMO即将推出docopt它看起来干净简单(简单就像我一样).我不完全确定我需要对我的旧代码做什么,所以上传我认为我需要做的事情.谁能告诉我这是否是正确的方向?我def main()现在该怎么办?和

#!/usr/bin/python

import sys, getopt, socket, fileinput, traceback
from Queue import Queue
from threading import Thread

def fread(FWORD, *args):
    flist = open(FWORD).readlines()
    return flist

def main(argv):

"""
Usage:
  your_script.py [-f <file>] [-p <proxy>] [-d <domain>] [-t] [-v]
  your_script.py -h | --help

Options:
  -h --help     Show this screen.
  -f --file     File to read potential Sub-domains from.
  -p --proxy    Proxy address and port. [default: http://127.0.0.1:8080]
  -d --domain   Domain to bruteforce.
  -t --thread   Thread count.
  -v --verbose  Turn debug on.
"""

# […] your code (NOT SURE WHAT CODE YOU MEAN? 

if __name__ == "__main__":
    from docopt import docopt
    arguments = docopt(__doc__, version='0.1a')
    print fread(FWORD)
Run Code Online (Sandbox Code Playgroud)

zmo*_*zmo 6

  1. geptopt在现代python中不推荐使用,你应该使用argparse.我个人更喜欢第三方docopt
  2. sys.argv数组作为参数赋予无用是main()因为您sys在模块上下文中全局导入模块(除了sys之外还有许多其他内容argv).你的代码只有在你进行导入时才有意义if __name__ == "__main__",但那时候这不是好的python练习.更好的做法是实际解析参数,然后将返回NamedTuple的参数作为参数main().

Argparse的例子

# […] your code

if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser(description='Your script.')
    parser.add_argument('--file', '-f', metavar='FILE', dest='file', type=file,
                       help='File to read potential Sub-domains from.')
    parser.add_argument('--proxy', '-p', dest='proxy', action='store',
                       help='Proxy address and port.', default='http://127.0.0.1:8080')
    parser.add_argument('--domain', '-d', dest='domain', action='store',
                       help='Domain to bruteforce.')
    parser.add_argument('--thread', '-t', dest='thread', action='store_true',
                       help='Thread count.')
    parser.add_argument('--verbose', '-v', dest='verbose', action='store_true',
                       help='Turn debug on.')
    args = parser.parse_args()
    main(args)
Run Code Online (Sandbox Code Playgroud)

docopt示例

Your script presentation.

"""
Usage:
  your_script.py [-f <file>] [-p <proxy>] [-d <domain>] [-t] [-v]
  your_script.py -h | --help

Options:
  -h --help     Show this screen.
  -f --file     File to read potential Sub-domains from.
  -p --proxy    Proxy address and port. [default: http://127.0.0.1:8080]
  -d --domain   Domain to bruteforce.
  -t --thread   Thread count.
  -v --verbose  Turn debug on.
"""

# […] your code

if __name__ == "__main__":
    from docopt import docopt
    arguments = docopt(__doc__, version='Naval Fate 2.0')
    main(arguments) # here using the parameter makes sense ;-)
Run Code Online (Sandbox Code Playgroud)