Skip to main content
 首页 » 编程设计

Python 用法不打印

2025年05月04日16linjiqin

我正在创建我的第一个 python“应用程序”,但我遇到了 args 问题或缺少 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 

代码

#!/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. geptopt 在现代 python 中已弃用,您应该使用 argparse反而。我个人比较喜欢第三者docopt
  2. 将 sys.argv 数组作为参数传递给 main() 是没有用的,因为您在模块上下文中全局导入了 sys 模块(除了 argv 之外,您还可以从 sys 使用许多其他东西)。只有在 if __name__ == "__main__" 中进行导入时,您的代码才有意义,但这不是 python 的良好做法。更好的做法是实际解析参数,然后给出返回的 NamedTuple作为 main() 的参数。

参数解析示例

# […] 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) 

文档示例

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