【问题标题】:Can't assign bash variable in python subprocess无法在 python 子进程中分配 bash 变量
【发布时间】:2022-01-16 19:01:49
【问题描述】:

我正在尝试将 python 脚本的 bash 子进程中的 pgp 键的指纹分配给变量。 这是一个sn-p:

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 脚本缺少什么?

提前谢谢大家。

【问题讨论】:

    标签: python bash variables subprocess gnupg


    【解决方案1】:

    问题在于您的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')
    

    【讨论】:

    • 谢谢,这样解决了
    【解决方案2】:

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

    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
    

    【讨论】:

    • 感谢您抽出宝贵时间回复,但还是不行。另外,我已经能够在其他子进程中成功执行多个命令,而无需;
    • 尝试编辑一个@rocky-evasive-dosage
    • 还是不行。使用capture_output=True 没有显示输出,所以我尝试touch 一个文件但它没有创建。
    • 立即尝试@rocky-evasive-dosage
    • 通过子流程我得到name 'ret' is not defined。与 popen:TypeError: memoryview: a bytes-like object is required, not 'str'
    猜你喜欢
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 2014-08-24
    • 2014-10-06
    相关资源
    最近更新 更多