os.popen如何设置为使用Bash?

时间:2015-11-03 15:15:39

标签: python bash operating-system subprocess

我有以下用于在Python中执行系统命令的函数:

def engage_command(
    command = None
    ):
    #os.system(command)
    return os.popen(command).read()

我正在使用os模块而不是subprocess模块,因为我正在处理一个与许多环境变量等交互的环境。

如何将Bash用于此类函数而不是默认的sh shell?

1 个答案:

答案 0 :(得分:4)

output = subprocess.check_output(command, shell=True, executable='/bin/bash')

os.popen() is implemented in terms of subprocess module

  

我正在处理一个与许多环境变量等交互的环境。

  1. 每次os.popen(cmd)调用都会创建 /bin/sh进程,以运行cmd shell命令。

    也许,从the os.popen() documentation that says开始并不明显:

      

    在命令cmd

    之间打开管道

    "打开一个管道" 没有清楚地沟通:"启动一个带有重定向标准输入或输出的新shell进程" - 你可以report a documentation issue

    如果有任何疑问; source确认每次成功的os.popen()来电都会创建新的子流程

  2. the child can't modify its parent process environment (normally)

  3. 考虑:

    import os
    #XXX BROKEN: it won't work as you expect
    print(os.popen("export VAR=value; echo ==$VAR==").read())
    print(os.popen("echo ==$VAR==").read())
    

    输出:

    ==value==
    
    ====
    

    ====表示第二个命令中$VAR为空,因为第二个命令在与第一个命令不同的/bin/sh进程中运行。

    要在单个进程中运行多个bash命令,请将它们放在脚本中或以字符串形式传递:

    output = check_output("\n".join(commands), shell=True, executable='/bin/bash')
    

    示例:

    #!/usr/bin/env python
    from subprocess import check_output
    
    output = check_output("""
        export VAR=value; echo ==$VAR==
        echo ==$VAR==
        """, shell=True, executable='/bin/bash')
    print(output.decode())
    

    输出:

    ==value==
    ==value==
    

    注意:此处$VAR不为空。

    如果需要动态生成新命令(基于以前命令的输出);它会创建several issues,并且可以使用pexpect模块修复部分问题:code example