【问题标题】:How to force os.system() to use bash instead of shell如何强制 os.system() 使用 bash 而不是 shell
【发布时间】:2018-09-13 16:39:39
【问题描述】:

我已经尝试了How to force /bin/bash interpreter for oneliners中所说的

通过做

os.system('GREPDB="my command"')
os.system('/bin/bash -c \'$GREPDB\'')

但是没有运气,不幸的是我需要使用 bash 运行此命令,并且 subp 在此环境中不是一个选项,我仅限于 python 2.4。有什么建议可以让我朝着正确的方向前进吗?

【问题讨论】:

  • 为什么subprocess module 不是一个选项?它在 Python 2.4 中受支持。
  • 很确定它在 2.4.6 中,但这是 2.4.3
  • exec* 的各种函数之一怎么样?
  • 将 shell 命令放在 shell 变量中几乎总是完全错误的做法。

标签: python bash python-2.4


【解决方案1】:

这两个命令都在不同的子shell中执行。

在第一个system 调用中设置变量不会影响第二个system 调用。

您需要将两个命令放在一个字符串中(将它们与; 组合在一起)。

>>> import os
>>> os.system('GREPDB="echo 123"; /bin/bash -c "$GREPDB"')
123
0

注意您需要使用"$GREPDB" 而不是'$GREPDBS'。否则,它会按字面意思解释,而不是展开。

如果你可以使用subprocess:

>>> import subprocess
>>> subprocess.call('/bin/bash -c "$GREPDB"', shell=True,
...                 env={'GREPDB': 'echo 123'})
123
0

【讨论】:

  • 不幸的是,这仍然给我shell错误:-(
  • @0n35,你能发布回溯吗?
【解决方案2】:

下面的解决方案最初仍会调用一个 shell,但它会为您尝试执行的命令切换到 bash:

os.system('/bin/bash -c "echo hello world"')

【讨论】:

    【解决方案3】:

    我用这个:

    subprocess.call(["bash","-c",cmd])
    

    //OK,忽略这个,因为我没有注意到子进程没有考虑。

    【讨论】:

    • 请多解释一下。它是如何工作的?为什么它是一种解决方法?
    • @Stibu 实际上这是在 windows msysgit 环境中解决我的问题的一种解决方法。
    【解决方案4】:
    subprocess.Popen(cmd, shell=True, executable='/bin/bash')
    

    【讨论】:

    • Popen 只是启动一个进程;您应该自己管理生成的对象。当然,您可以改用subprocess.run(),它会为您完成所有这些工作。
    【解决方案5】:

    我搜索了这个命令几天,发现了真正有效的代码:

    import subprocess
    
    def bash_command(cmd):
        subprocess.Popen(['/bin/bash', '-c', cmd])
    
    code="abcde"
    // you can use echo options such as -e
    bash_command('echo -ne "'+code+'"')
    

    输出:

    abcde
    

    【讨论】:

    • echo 特别不是一个很好的例子;你应该更喜欢printf。虽然我认为如果您的具体问题是“我如何使用 Python 中的 Bash 内置 echo?”,这将起作用。
    猜你喜欢
    • 2018-06-11
    • 2021-05-31
    • 2010-09-14
    • 1970-01-01
    • 2018-02-04
    • 2013-09-09
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多