无法在 python 子流程中分配 bash 变量

Can't assign bash variable in python subprocess

我正在尝试将 python 脚本的 bash 子进程中的 pgp 密钥指纹分配给变量。 这是一个片段:

import subprocess
subprocess.run(
'''
    export KEYFINGERPRINT="$(gpg --with-colons --fingerprint --list-secret-keys | sed -n 's/^fpr:::::::::\([[:alnum:]]\+\)://p')"
    echo "KEY FINGERPRINT IS: ${KEYFINGERPRINT}"
''',
shell=True, check=True,
executable='/bin/bash')

代码 运行s 但 echo 显示一个空变量: KEY FINGERPRINT IS: 如果我尝试将该变量用于其他命令,则会出现以下错误: gpg: key "" not found: Not found

但是,如果我在 bash 脚本中 运行 完全相同的两行 bash 代码,则一切正常,并且变量已正确分配。

我的 python 脚本丢失了什么?

提前谢谢大家。

为了 运行 子进程中的 2 个命令,您需要一个接一个地 运行 它们或使用 ;

import subprocess
ret = subprocess.run('export KEYFINGERPRINT="$(gpg --with-colons --fingerprint --list-secret-keys | sed -n 's/^fpr:::::::::\([[:alnum:]]\+\)://p')"; echo "KEY FINGERPRINT IS: ${KEYFINGERPRINT}"', capture_output=True, shell=True)
print(ret.stdout.decode())

你可以使用 popen:

commands = '''
    export KEYFINGERPRINT="$(gpg --with-colons --fingerprint --list-secret-keys | sed -n 's/^fpr:::::::::\([[:alnum:]]\+\)://p')"
    echo "KEY FINGERPRINT IS: ${KEYFINGERPRINT}"
'''
process = subprocess.Popen('/bin/bash', stdin=subprocess.PIPE, stdout=subprocess.PIPE)
out, err = process.communicate(commands)
print out

问题出在您的 sed 命令中的反斜杠。当您将它们粘贴到 Python 字符串中时,python 会转义反斜杠。要解决此问题,只需在字符串前面添加一个 r 使其成为原始字符串:

import subprocess
subprocess.run(
r'''
    export KEYFINGERPRINT="$(gpg --with-colons --fingerprint --list-secret-keys | sed -n 's/^fpr:::::::::\([[:alnum:]]\+\)://p')"
    echo "KEY FINGERPRINT IS: ${KEYFINGERPRINT}"
''',
shell=True, check=True,
executable='/bin/bash')