我正试图将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