[英]How to pass escape characters as command line parameters using python
I wrote a python script needed 2 command line arguments, and there are some '&'
s in the 2nd parameter. 我写了一个需要2个命令行参数的python脚本,并且在2nd参数中有一些'&'
。 And I received the error zsh parse error near &', so I tried to quoted and double-quoted these 2 parameters but the result went wrong. 而且我在&'附近收到错误zsh parse错误,因此我尝试用引号和双引号将这2个参数括起来,但结果出错了。 The code is simplified as below: 代码简化如下:
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
and following is the configuration in pycharm 以下是pycharm中的配置
print sys.argv[2] == string_to_sign
returned False
and print sys.argv[2] == string_to_sign
返回False
,
The result of signature(secret_access_key, string_to_sign)
is what I expected, but I need to pass these 2 parameters in command line. signature(secret_access_key, string_to_sign)
是我所期望的,但是我需要在命令行中传递这两个参数。
So is there any way to escape '&'
and '\\n'
in command line? 那么,有什么方法可以在命令行中转义'&'
和'\\n'
?
You need to put quotes around your input parameters: 您需要在输入参数周围加上引号:
python yourscript.py "a" "b\nc\nd\&ef"
and change your script to replace the string "\\n"
with a carriage return: 并更改您的脚本,以用回车符替换字符串"\\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
This gives as output: 这给出了输出:
iF5JXP343nGyFhcagBhVDVDSnECQpHDMnuq%2F6ryFzBc%3D
iF5JXP343nGyFhcagBhVDVDSnECQpHDMnuq%2F6ryFzBc%3D
True
If you want to include literal newlines; 如果要包括文字换行符; you could use $''
in bash, zsh: 您可以在bash,zsh中使用$''
:
$ python -c'import sys; print(sys.argv)' a $'b\nc\nd&e&f'
['-c', 'a', 'b\nc\nd&e&f']
If you want two characters: backslash + n
then drop $
: 如果要两个字符:反斜杠+ n
然后放$
:
$ python -c'import sys; print(sys.argv)' a 'b\nc\nd&e&f'
['-c', 'a', 'b\\nc\\nd&e&f']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.