我需要使用我的 Python 脚本生成echo
并调用 JSON 配置文件。tee
通过反复试验,我发现我必须使用单引号。然而,我不理解我在使用 Python 的run()
. 以下代码打印我的问题:
#!/usr/bin/env python3
from subprocess import run
conf_file="""{
"alt-speed-down": 50,
}"""
print("Question 1. It does not work with double quotes. Why?")
run(f"""echo "{conf_file}" """, shell=True)
print("It works with single quotes.")
run(f"""echo '{conf_file}'""", shell=True)
conf_file="""{
\"alt-speed-down\": 50,
}"""
print("""Question 2. It does not work with double quotes, even when I escape the quotes.
Whereas when I type in my shell:
echo "\"This is a quoted string.\""
it works. Why?
""")
run(f"""echo "{conf_file}" """, shell=True)
print("""Question 3. It works with single quotes, even with escaped quotes.
whearas when I type in my shell:
echo '\"this is quoted\"'
I get the backslashes printed. Why aren't
the backslashes printed when called with Python's run()?""")
run(f"""echo '{conf_file}'""", shell=True)
我使用 Bash 作为我的 shell。与 Python 的运行相比,为什么从我的 Bash shell 转义双引号会有所不同。我不是通过指定
shell=True
in来访问我的 Bash shell 吗run()
?
PS 我知道用json
模块生成 JSON 是一种方法,但在我的例子中,它主要是从我的备份配置文件中复制现有的 JSON。我想避免在我的脚本中将此类 JSON 文件读入字符串 - 该脚本旨在在新重新安装的操作系统上运行,此类备份最初不可用。这就是为什么我需要在我的 Python 字符串中有很多字符串变量来存储这样的 JSON 配置文件
关于引号,撇开换行符,这是:
将字符串分配
{ "alt-speed-down": 50, }
给变量。然后当您运行时run(f"""echo "{conf_file}" """, shell=True)
,shell 会看到字符串这与单引号不同:
在这里,反斜杠转义了双引号,并被 Python 删除,因此这与第一个相同。在这里转义引号不是必需的,但如果你有的
"{ \"alt-speed-down\": 50, }"
话。如果你想让 Python 字符串中的反斜杠完好无损,你需要使用
r''
字符串,例如r'{ \"alt-speed-down\": 50, }'
(或者与双引号相同,r"{ \"alt-speed-down\": 50, }"
实际上也有效,并且反斜杠没有被删除,即使它们不需要结束引用的字符串。)在 shell 中,反斜杠不在单引号内处理,所以
传递给
echo
字符串\"this is quoted\"
。尽管 的某些实现echo
会处理转义\n
,例如 ,而不管 shell 命令行处理中发生了什么。而与
你看不到反斜杠。
简而言之,shell 和 Python 之间的引用规则不同。
看:
正如评论中提到的那样,从 Python 生成 JSON(或 YAML,或其他)可能比手动打印字符串更好。例如
json
模块: