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 干扰字符串中的反斜杠。