Python3 运行 一个复杂的 shell 命令,包含多个预期的引用
Python3 run a complex shell command with multiple intended quotations
当我 运行 来自 bash:
# su -c "psql -d mapping -c \"INSERT INTO mapping (ip,username) VALUES('1.2.3.4','test');\"" postgres
它工作正常,但是当我尝试从 python:
subprocess.run("su -c \"psql -d mapping -c \"INSERT INTO mapping (ip,username) VALUES('1.2.3.4','test');\"\" postgres")
它失败了,我尝试了不同的引号,但都失败了。你能帮忙吗?
有两种解决方案,具体取决于您是否使用 Python 中的 shell。简单但效率低下的解决方案是使用 shell=True
传递字符串,基本上只需在其周围添加 Python 引号。
subprocess.run(r'''su -c "psql -d mapping -c \"INSERT INTO mapping (ip,username) VALUES('1.2.3.4','test');\"" postgres''', shell=True,
# For good measure, you should check its status
check=True)
更有效,实际上也许更易读,您可以从等式中删除 shell,然后自己将命令拆分为字符串。
subprocess.run([
'su', '-c',
# The argument to "su -c" should be one string
# Because we escaped the shell, the double quotes don't need escaping
'''psql -d mapping -c "INSERT INTO mapping (ip,username) VALUES('1.2.3.4','test');"''',
'postgres'],
check=True)
注意 shell=True
第一个参数是如何传递给 shell 的字符串,而没有它,您将标记列表直接传递给 OS 级别exec()
或(在 Windows 上不太直接)CreateProcess()
。另请注意,在第一个实例中,我如何使用 r'...'
字符串来避免 Python 干扰字符串中的反斜杠。
当我 运行 来自 bash:
# su -c "psql -d mapping -c \"INSERT INTO mapping (ip,username) VALUES('1.2.3.4','test');\"" postgres
它工作正常,但是当我尝试从 python:
subprocess.run("su -c \"psql -d mapping -c \"INSERT INTO mapping (ip,username) VALUES('1.2.3.4','test');\"\" postgres")
它失败了,我尝试了不同的引号,但都失败了。你能帮忙吗?
有两种解决方案,具体取决于您是否使用 Python 中的 shell。简单但效率低下的解决方案是使用 shell=True
传递字符串,基本上只需在其周围添加 Python 引号。
subprocess.run(r'''su -c "psql -d mapping -c \"INSERT INTO mapping (ip,username) VALUES('1.2.3.4','test');\"" postgres''', shell=True,
# For good measure, you should check its status
check=True)
更有效,实际上也许更易读,您可以从等式中删除 shell,然后自己将命令拆分为字符串。
subprocess.run([
'su', '-c',
# The argument to "su -c" should be one string
# Because we escaped the shell, the double quotes don't need escaping
'''psql -d mapping -c "INSERT INTO mapping (ip,username) VALUES('1.2.3.4','test');"''',
'postgres'],
check=True)
注意 shell=True
第一个参数是如何传递给 shell 的字符串,而没有它,您将标记列表直接传递给 OS 级别exec()
或(在 Windows 上不太直接)CreateProcess()
。另请注意,在第一个实例中,我如何使用 r'...'
字符串来避免 Python 干扰字符串中的反斜杠。