【问题标题】:Python 2.7 exiting from main and return exit status, what am I doing wrong?Python 2.7 从 main 退出并返回退出状态,我做错了什么?
【发布时间】:2014-06-13 06:04:02
【问题描述】:

这是一个无限循环的问题,cmets 的小伙伴们给我指正,如果你愿意,可以把它拿下来。

我在这里阅读了其他一些问题和答案,并尝试实施这些建议,但无济于事。因为我不是在编写专有代码,所以我可以完整地发布它,它不会那么长,但我希望堆栈交换不介意......另外,随意使用和/或修改你想要的。

    #!/usr/bin/env python2.7

    import sys, random, subprocess, signal


    def main(argv=None):
        if argv is None:
            argv = sys.argv
        def signal_handler(signal, frame):
            fdHT.close()
            fdWL.close()
            print '\n'
            return 1

        signal.signal(signal.SIGINT, signal_handler)

        pathToWL = str(sys.argv[1])
        pathForHT = str(sys.argv[2])
        mId = str(sys.argv[3])

        SaltCharSet = str("a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9")
        SaltCharSet = SaltCharSet.split(" ")

        try:
            fdWL = open(pathToWL, 'r')
        except:
            print "Could not open wordlist file."
            return 2

        try:
            fdHT = open(pathForHT, 'a')
        except:
            print "Could not open file for hash table"
            fdWL.close()
            return 3

        #We have our wordlist now step through the thing and start generating hashes.

        toStop = False
        #cursor = 0 #Use the cursor later once this program evolves

        #print 'Entering while 1'
        while(toStop == False):
            try:
                ln = str(fdWL.readline())
            except:
                fdHT.close()
                fdWL.close()
                return 4
            if ln == '':
                toStop = True #This should have been an ASSIGNMENT not a test, was ==
            ln = ln.strip("\n")
            ln = ln.strip("\r")
            if len(ln) < 6:
                continue
            # create random salts
            # send ln, id, and salts to hashpipe
            salt = []
            lenOfSalt = random.randint(6,16)
            #print 'Entering while 2'
            while(len(salt) < lenOfSalt + 1):
                aORn = random.randint(0,1)
                if aORn == 0:# Its a letter
                    uORl = random.randint(0,1)
                    if uORl == 0:
                        salt.append(SaltCharSet[(random.randint(0,25))].upper())
                    elif uORl == 1:
                        salt.append(SaltCharSet[(random.randint(0,25))].lower())
                    else:
                        print "Random Int 'uORl' out of bounds"
                        fdHT.close()
                        fdWL.close()
                        toStop = True
                        return 5 # I don't know what happened
                elif aORn == 1:# Its a number
                    salt.append(SaltCharSet[(random.randint(26, 35))])
                else:
                    print "Random Int 'aORn' out of bounds"
                    fdHT.close()
                    fdWL.close()
                    toStop = True
                    return 6 # I don't know what happened
            #Generated Salt
            salt = "".join(salt)
            wholeArg2 = str("$"+mId+"$"+salt)
            try:
                mHash = str(subprocess.check_output([r"hashpipe", ln, wholeArg2]))
            except:
                print " error getting hash"
                #Clean-up
                fdHT.close()
                fdWL.close()
                toStop = True
                return 7
            #Generated hash, now write it to the fdHT file
            print str(ln+"\t"+mHash)
            fdHT.write(str(ln+"\t"+mHash))
            #cursor = fdWL.tell()

        print 'done with whiles'
        fdHT.close()
        fdWL.close()

        return 0

    if __name__ == "__main__":
        sys.exit(main())

这个脚本调用了我编写的一个小 C 程序,使用 GNUs crypt_r() 函数对字符串进行哈希处理...它挂在最后,我必须使用 ctrl-c 来保释...这里是一些示例输出。 ..

    zurumba`tico    $6$96u6sUy05rM69$1NLxLYXS9tAf05szgV0/GH6pvykOPsuEIlGxOkDOMNEixGiN8oeTG.xxIq/D19YpArMWtD1xJMG9sKWgA9xzK/

    zurupeto    $6$O2510Y900o02008$BO2OadT8Bvje78C2JhuZ6r/.iJHz.s9UfET8MU93iGy57bbe/qh9/Uj4jSkVSCyknegnkAB2JF7vRgWohkGVI0

    zutana  $6$Ur2i9m95$E2WqrEnld4aPa1bYAlCNnMEE0nmwxNlfB9ozVc3I6NCKXHqnSyspZrqIq2usqNf2JwlVF1myhqIn26a71Dm510

    zutano  $6$8x482Lar4qj$LupCZ9t2ImG.nRVH9xHPsyyx9emiImNTRaErxNrtsGyWjeO3XZLzj.F1D3eQOsiurQeQMWeQ3lF5ef.o3iesg.

    zuzo`n  $6$G9JP2GE$FAoZGGQNNycPfGCHq/Ra4MSQNknATMgHLzk8N9FHDefbZm/Hcx6JdV/sZdbkFHVVkoRjTnoUP9mw6CkE/.4fI.

    ^C

我哪里出错了?

【问题讨论】:

  • 出于好奇,为什么不使用 python 的 crypthashlib 模块?
  • 但是,在一般情况下,您有两个可能无限的while 循环。你确定他们的终止条件受到了影响吗?我还建议将其分解为几个子功能,而不是一个巨大的单片功能,这样调试起来会容易得多。
  • 程序停止,但没有返回,所以当我回到我的电脑时,我必须按 ctrl-c,这没什么大不了的,但它不正确。我很确定它在到达 EOF 或 '' 字符串时会停止。盐的长度最终总会得到满足,从 6 到 16 它只是不断将伪随机字母数字字符添加到列表中,最终总是最多达到 16。我认为这与杀死main() 函数线程,但不一定是程序的执行。我认为 sys.exit() 的一些怪癖,也许我需要捕获 sys.exit() 引发的异常
  • 实际上@aruisdante 是正确的,我打印了'at EOF'和if ln == '' 语句,它不断地打印“at EOF”。现在我需要学习如何正确阅读 EOF,谢谢伙计。
  • 如果要从文件中读取行,只需使用with open(...) as f: 后跟for line in f:(示例here)。它将在文件末尾自动停止。假设文件在您阅读时没有被写入。当你读完文件时,它也会正确地close

标签: python return main exit freeze


【解决方案1】:

我认为您可以进行两项更改,以提高您编写正常工作代码的机会。

首先,使用with 语句来处理打开和关闭文件。如果稍后在代码中发生异常或return 语句,使用with open("filename") as file_obj 将自动关闭文件。

其次,使用for 循环读取文件的行,而不是在while 循环的每个循环中调用readlinefor 循环将一直运行到找到文件末尾,然后停止。如果您需要对文件结尾的反应不同于对某些其他终止条件的反应,您可以使用break 处理特殊的终止情况,并在循环上放置一个else 子句(仅当for 循环完成时才会运行不破)。

【讨论】:

  • 实际上这个错误是在 if ln = '' 之后使用 test "==" 它应该是 toStop = True 而不是 toStop == True 我的错。我正在阅读大量的单词表,不想一次阅读整个文件。我知道我可以使用读取生成器,我刚刚在这里了解到stackoverflow.com/questions/4426581/… 但是,我认为readline() 就是这样做的,一次遍历文件一行,所以为什么要复制该功能,尤其是当我不这样做的时候知道在read(n)中设置n的行有多长@
  • 如果我将来使用 python 读取文件(很有可能),我将不得不尝试您的建议,可能会减少我需要编写的代码量。
  • @Overloaded_Operator:啊,很好地抓住了当前代码中问题的根源。我主要是给出一个“风格”的答案,因为问题的顶部说已经确定了无限循环。无论如何,直接在文件对象上使用循环与使用readline 的当前循环基本相同,它只是为您处理EOF。无需一次read 整个文件!
【解决方案2】:

可能有更好的答案,而且我很可能不是很“pythonic”,我不是一个可以说的人,但这解决了问题,但也可能会引发另一个问题,我预计空行不包含任何内容但是“\r\n”或“\n\r”。

更新:我将 if 语句移回到条带之前,它仍然适用于该文件,但可能无法正常工作。时间会证明一切,但我只需要它就能工作,而且确实如此。

原创

    if ln == '':
            toStop == True #This should have been an ASSIGNMENT not a test, was ==
        ln = ln.strip("\n")
        ln = ln.strip("\r")

工作 如果 ln == '': 打印'在EOF' toStop = 真 ln = ln.strip("\n") ln = ln.strip("\r")

输出

    Entering while 2
    zurupeto    $6$w2206117WV1E1$JHkrmXu/RZirctvucEUT8eCNLOTpivn4LwoNRtmq6OfocHhf54bkoggjxVN/35k3j9WgJ5NaXWZY0nDML4qUf1

    Entering while 2
    zutana  $6$wfIF8ry4934271Si$4U8oiMp9/RA1glWf8aVV/uWqMyYybR1VbpR4qbcgNyv3YCERkdzaSpcJMLXtD9uT9Wt0nb4D5oqiJjfMM.8w01

    Entering while 2
    zutano  $6$3gi4C0V2hD49dSOU$y09sCx5aUnheWGKA0HnnRBnINojfZY6WY.CaKeMAej9Y9KdXfBE/aQVqcxxvFbBRuL.Q5Tzr2d1V9oznZPaFs/

    Entering while 2
    zuzo`n  $6$mkZ810VB4Qft90ap$PbtYHX9e5PvnlzgtgODOYb/U3EmgA1AsCrf7tLRnE/DQ8hQ1Ltx3yuul5HEz9JAXnMzflcoN6Vwdfl38oIIOS0

    at EOF
    done with whiles

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 2015-02-01
    • 2017-05-20
    • 2017-05-18
    相关资源
    最近更新 更多