Python使用不打印

时间:2014-03-06 13:10:44

标签: 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

CODE

#!/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:])

好的感谢所有评论和指示。 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)

1 个答案:

答案 0 :(得分:6)

    在现代python中不推荐使用
  1. geptopt,您应该使用argparse。我个人更喜欢第三方docopt
  2. sys.argv数组作为参数提供给main()是没用的,因为您在模块上下文中全局导入sys模块(还有许多其他内容可以在sys中使用)除了argv)。只有在if __name__ == "__main__"中进行导入时,您的代码才有意义,但那样做不是很好的python练习。更好的做法是实际解析参数,然后将返回的NamedTuple作为main()的参数。
  3. 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)
    

    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 ;-)