考虑这个命令
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字符串,以便部分是必需的。 有人有任何解决方案吗?
答案 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
做什么
答案 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)
如果呼叫失败,它也会抛出异常!