无法在 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')
我正在尝试将 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')