【问题标题】:Python getopt not setting correct valuePython getopt没有设置正确的值
【发布时间】:2017-06-15 12:24:25
【问题描述】:

可能是我完全误解了 getopt 模块

我正在尝试将 [--magic-m] 解析为我的程序,但它没有设置正确的字段。

部分加密功能

def encrypt(filename, text, magic):
    if not magic is None:
        hash = pbkdf2_sha256.encrypt(magic, rounds=10000, salt_size=16)
        print pbkdf2_sha256.verify(magic, hash)
    try:
        d = load_image( filename )
    except Exception,e:
        print str(e)

部分加载函数

def load_image( filename ) :
    img = Image.open( os.path.join(__location__, filename) )
    img.load()
    data = np.asarray( img, dtype="int32" )
    return data

主要

if __name__ == "__main__":
    if not len(sys.argv[1:]):
        usage()
    try:
        opts,args = getopt.getopt(sys.argv[1:],"hedm:",["help", "encrypt", "decrypt", "magic="])
    except getopt.GetoptError as err:
        print str(err)
        usage()

    magic = None
    for o,a in opts:
        if o in ("-h","--help"):
            usage()
        elif o in ("-e","--encrypt"):
            to_encrypt = True
        elif o in ("-d","--decrypt"):
            to_encrypt = False
        elif o in ("-m", "--magic"):
            magic = a
        else:
            assert False,"Unhandled Option"

    print magic
    if not to_encrypt:
        filename    = sys.argv[2]
        decrypt(filename, magic)
    else:
        filename    = sys.argv[2]
        text        = sys.argv[3]
        encrypt(filename, text, magic)

我试着像这样调用上面的程序:

[1] python stego.py -e test.jpeg lol -m h

或者像这样:

[2] python stego.py -e -m h test.jpeg lol

输出变为:

[1] None

[2] lol
[2] True
[2] [Errno 2] No such file or directory: 'C:\\Users\\Educontract\\Steganography\\-m'

没有选项 -m 一切正常

【问题讨论】:

    标签: python getopt


    【解决方案1】:

    冒号应该在之后 m 表示它需要一个参数。您还应该在长选项magic 之后包含一个等号,以表明它需要一个参数。

    getopt.getopt(sys.argv[1:],"hedm:",["help", "encrypt", "decrypt", "magic="])
    

    您应该将所有选项放在参数之前,就像您的第二个示例一样。

    python stego.py -e -m h test.jpeg lol
    

    如果你打印sys.argv,我想你会发现sys.argv[2]sys.argv[3] 不是你所期望的。我会从args 获取参数,而不是sys.argv

    filename    = args[0]
    text        = args[1]
    

    请注意,您可能会发现使用argparse 库而不是getopt 更容易。在参数之前要求选项并不那么严格。

    【讨论】:

    • 我试过了,但它仍然给我一个错误C:\Users\Educontract\Steganography>python stego.py -e -m lol test.jpeg lollol True [Errno 2] No such file or directory: 'C:\\Users\\Educontract\\Steganography\\-m'
    • 我会查找 argparse 看它是否更适合我的需要
    • @Ludisposed 哪个错误?请注意,您已将冒号 置于“魔术”参数之前。
    • @Jean-FrançoisFabre 我把那句话改成了 Alasdair 的建议
    • 请编辑您的问题并包含完整的回溯。
    猜你喜欢
    • 2014-06-16
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2016-06-04
    • 2012-12-13
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    相关资源
    最近更新 更多