os.system()与Ubuntu中的“strings”命令一起使用时不起作用

时间:2015-03-05 11:01:26

标签: python linux string ubuntu os.system

考虑这个命令

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字符串,以便部分是必需的。 有人有任何解决方案吗?

3 个答案:

答案 0 :(得分:3)

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

所以在你的终端--encoding={b,l}中可以通过bash扩展到--encoding=b --encoding=l,而dash(可能由os.system称为/ bin / sh)没有这样的扩展,它仍然是{{1} }

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

您应该使用--encoding={b,l}模块而不是subprocess。请注意,在使用os.system()参数时,它也会调用默认的shell=True,但不能保证是bash。

答案 1 :(得分:3)

您不需要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)

shell=True做什么

的一个很好的解释here

答案 2 :(得分:0)

os.system已过时,请改用subprocess。你也应该使用shell=True来表达行为:

import subprocess

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

如果呼叫失败,它也会抛出异常!