当 args 包含单引号和双引号时,如何将命令 args 传递给 python 脚本?

Posted

技术标签:

【中文标题】当 args 包含单引号和双引号时,如何将命令 args 传递给 python 脚本?【英文标题】:how to pass command args to python scripts when the args contains the Single quotes and Double quotation marks? 【发布时间】:2021-09-12 11:51:14 【问题描述】:
import sys
import json

if __name__ == '__main__':
    print(sys.argv)
    print(json.loads(sys.argv[1]))

结果:

(env) λ python main.py '["br_V1R22C00RR1_bugfix"]'
['main.py', "'[br_V1R22C00RR1_bugfix]'"]
Traceback (most recent call last):
  File "C:\Users\x\PycharmProjects\GaussClientUpgrade\main.py", line 30, in <module>
    print(json.loads(sys.argv[1]))
  File "c:\users\x\appdata\local\programs\python\python39\lib\json\__init__.py", line 346, in loads
    return _default_decoder.decode(s)
  File "c:\users\x3\appdata\local\programs\python\python39\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "c:\users\x\appdata\local\programs\python\python39\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

我想传递一个像 '["br_V1R22C00RR1_bugfix"]' 这样的字符串,不要去掉 ' 和 ",这是一个 json.dumps(list) 的结果,我使用 json.loads 来加载 '["br_V1R22C00RR1_bugfix “]”。

但是我怎样才能传递我想要的字符串呢?

【问题讨论】:

我无法重现该问题。使用这些命令行参数,sys.argv 在我的测试中是[..., '-b', '["br_V1R22C00RR1_bugfix"]']。我特别不明白如何在不明确这样做的情况下删除"。请提供minimal reproducible example。 我已经修改了代码,所以你可以运行它。 【参考方案1】:

这个问题与程序语言无关,例如在java中也可以发生。

这是因为 bash 和 dos 之间的参数处理不同。

在 Linux 中:

[root@clarence lib]# python test.py \"['br']\"
"[br]"
[br]
[root@clarence lib]# python test.py '["br"]'
["br"]
['br']
[root@clarence lib]# python test.py [\"br\"]
["br"]
['br']
[root@clarence lib]# python test.py "[\"br\"]"
["br"]
['br']
[root@clarence lib]# python test.py "['br']"
['br']
Traceback (most recent call last):
  File "test.py", line 7, in <module>
    print(json.loads(sys.argv[1]))
  File "/usr/lib64/python3.7/json/__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "/usr/lib64/python3.7/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib64/python3.7/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 2 (char 1)
[root@clarence lib]# python test.py "[\"br\"trer't]"
["br"trer't]
Traceback (most recent call last):

在windows中:

(env) λ python test.py \"['br']\"
"['br']"
['br']
(env) λ python test.py '["br"]'
'[br]'
Traceback (most recent call last):
  File "C:\Users\clarence\Desktop\test.py", line 7, in <module>
    print(json.loads(sys.argv[1]))
(env) λ python test.py [\"br\"]
["br"]
['br']
(env) λ python test.py "[\"br\"]"
["br"]
['br']
(env) λ python test.py "['br']"
['br']
Traceback (most recent call last):

python test.py '["br"]' 在bash中可以成功运行,但是在dos中不行。

【讨论】:

祝你好运。宫城先生。谢谢你改变答案。

以上是关于当 args 包含单引号和双引号时,如何将命令 args 传递给 python 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

PHP:在单个字符串中使用单引号和双引号

选择包含混合单引号和双引号的元组的查询

单引号和双引号有啥区别?

JavaScript字符串单引号和双引号的使用

JavaScript字符串单引号和双引号的使用

Shell 中单引号和双引号区别