os.system() 在 Ubuntu 中与 "strings" 命令一起使用时不起作用

os.system() when used with "strings" command in Ubuntu not working

考虑这个命令

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")

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

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

import subprocess

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

调用失败也会抛异常!

ubuntu 默认使用短划线作为 /bin/sh,bash 用于登录 shells.

因此在您的终端中 --encoding={b,l} 可能会被 bash 扩展为 --encoding=b --encoding=l,而破折号(可能被 os.system 称为 /bin/sh)不会这样的扩展,它仍然是 --encoding={b,l}

最简单的方法是显式扩展编码参数,不要将其留给 shell,然后它将与任何 shell.

一起使用

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

您不需要 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 的作用