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



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

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

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

然而,如果我在bash脚本中运行完全相同的两行bash代码,那么一切都会完美地工作,并且变量被正确地分配。

我的python脚本缺少什么?

提前谢谢大家。

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

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

为了在子流程中运行两个命令,您需要一个接一个地运行它们,或者使用;

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

最新更新