Python getopt 没有设置正确的值
Python getopt not setting correct value
可能是我完全误解了 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 一切正常
冒号应该在之后 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
更容易。在参数之前要求选项并不那么严格。
可能是我完全误解了 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 一切正常
冒号应该在之后 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
更容易。在参数之前要求选项并不那么严格。