【问题标题】:How to pass escape characters as command line parameters using python如何使用python将转义字符作为命令行参数传递
【发布时间】:2015-11-18 21:48:39
【问题描述】:

我写了一个python脚本,需要2个命令行参数,第二个参数中有一些'&'s。我在&'附近收到错误zsh parse error,所以我尝试引用并双引号这2个参数,但结果出错了。代码简化如下:

import base64, hmac, urllib, sys  
from hashlib import sha256  
def signature(secret_access_key, string_to_sign):  
    h = hmac.new(secret_access_key, digestmod=sha256)
    h.update(string_to_sign)
    sign = base64.b64encode(h.digest()).strip()  
    return urllib.quote_plus(sign)  
if __name__ == '__main__':  
    secret_access_key = 'a'  
    string_to_sign = 'b\nc\nd&e&f'  
    print signature(secret_access_key, string_to_sign)  
    print signature(sys.argv[1], sys.argv[2])  
    print sys.argv[2] == string_to_sign  

以下是pycharm中的配置

print sys.argv[2] == string_to_sign返回False
signature(secret_access_key, string_to_sign) 的结果是我所期望的,但是我需要在命令行中传递这两个参数。
那么有什么办法可以在命令行中转义'&''\n' 吗?

【问题讨论】:

    标签: python python-2.7 escaping command-line-interface


    【解决方案1】:

    您需要在输入参数周围加上引号:

    python yourscript.py "a" "b\nc\nd\&ef"
    

    并更改您的脚本以将字符串 "\n" 替换为回车:

    import base64, hmac, urllib, sys  
    from hashlib import sha256  
    def signature(secret_access_key, string_to_sign):  
        h = hmac.new(secret_access_key, digestmod=sha256)
        h.update(string_to_sign)
        sign = base64.b64encode(h.digest()).strip()  
        return urllib.quote_plus(sign)  
    if __name__ == '__main__':  
        secret_access_key = 'a'  
        string_to_sign = 'b\nc\nd&e&f'    
        input_argument = sys.argv[2].replace(r'\n','\n')
        print signature(secret_access_key, string_to_sign)  
        print signature(sys.argv[1], input_argument)      
        print input_argument == string_to_sign  
    

    这给出了输出:

    iF5JXP343nGyFhcagBhVDVDSnECQpHDMnuq%2F6ryFzBc%3D
    iF5JXP343nGyFhcagBhVDVDSnECQpHDMnuq%2F6ryFzBc%3D
    True
    

    【讨论】:

    • 我尝试在CLI中引用和双引号这两个参数但结果不同,print sys.argv[2], string_to_sign的结果也是如此
    • 您是否也逃脱了string_to_sign 值?
    • 没有必要逃逸string_to_sign,因为非逃逸string_to_sign正是我所需要的。
    • 但是iF5JXP343nGyFhcagBhVDVDSnECQpHDMnuq%2F6ryFzBc%3D 是我想要的结果。我可以在不转义string_to_sign 的情况下得到这个
    • 在这种情况下,您需要引用您的输入参数并将字符串 \n 替换为回车符,请参阅更新后的答案
    【解决方案2】:

    如果你想包含文字换行符;你可以在 bash、zsh 中使用$''

    $ python -c'import sys; print(sys.argv)' a $'b\nc\nd&e&f'
    ['-c', 'a', 'b\nc\nd&e&f']
    

    如果你想要两个字符:反斜杠 + n 然后删除 $

    $ python -c'import sys; print(sys.argv)' a 'b\nc\nd&e&f'
    ['-c', 'a', 'b\\nc\\nd&e&f']
    

    【讨论】:

    • 这是我想要的输出。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2011-08-10
    • 2011-08-01
    • 2020-03-09
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    相关资源
    最近更新 更多