【问题标题】:os.system() when used with "strings" command in Ubuntu not workingos.system() 在 Ubuntu 中与“字符串”命令一起使用时不起作用
【发布时间】:2015-03-05 11:01:26
【问题描述】:

考虑这个命令

strings --radix=d --encoding={b,l} abc.exe >> xyz.txt

当我在 Ubuntu 终端上运行它时,它可以正常工作。 但是,当我通过 python 代码使用它时:

import os
os.system("strings --radix=d --encoding={b,l} abc.exe >> xyz.txt")

它不工作。 如果我删除“编码”,那么它在这两种情况下都可以正常工作。 但是,我需要获取 Unicode 字符串,所以这部分是必要的。 谁有解决办法?

【问题讨论】:

    标签: python linux string ubuntu os.system


    【解决方案1】:

    ubuntu 默认使用 dash 作为 /bin/sh,使用 bash 作为登录 shell。

    因此,在您的终端中,--encoding={b,l} 可能被 bash 扩展为 --encoding=b --encoding=l,而 dash(可能被 os.system 称为 /bin/sh)没有这种扩展,它仍然是 --encoding={b,l}

    最简单的方法是显式扩展编码参数并且不要将其留给shell,那么它将适用于任何shell。

    您应该使用subprocess 模块而不是os.system()。请注意,在使用 shell=True 参数时,它还会调用默认的 /bin/sh,但不能保证是 bash。

    【讨论】:

    • 显式扩展为 --encoding=l 工作。谢谢。
    【解决方案2】:

    您不需要shell=True,您可以传递参数列表并将stdout 写入文件:

    from subprocess import check_call
    with open('xyz.txt',"a") as out:
        check_call(['strings', '--radix=d', '--encoding={b,l}', 'abc.exe'],stdout=out)
    

    很好地解释了here shell=True 的作用

    【讨论】:

      【解决方案3】:

      os.system 已过时,请改用子进程。你也应该使用shell=True 来获得类似sh 的行为:

      import subprocess
      
      cmd = "strings --radix=d --encoding={b,l} abc.exe >> xyz.txt"
      subprocess.check_call(cmd, shell=True)
      

      调用失败也会抛出异常!

      【讨论】:

      • @PadraicCunningham:但是没有shell=True,重定向将不起作用!
      • @rodrigo,如果您使用 args 列表并按照我的回答重定向标准输出,它会这样做
      猜你喜欢
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      相关资源
      最近更新 更多