导致Python错误的Ascii字符27(ESC)

时间:2017-01-24 11:08:22

标签: python ios macos

我有一个连接到iPhone的Python程序并取消了my_app.app,但它也探索了.app文件夹以找到二进制名称,因为有时它们可​​能不同。 my_app.app并不意味着二进制文件名为my_app。令人沮丧。

所以我抓住二进制名称,然后我以前运行的程序突然停止工作,似乎将二进制名称从iPhone拉回到Mac时,它会在开头插入ESC字符或ASCII字符27二进制字符串的结尾。我以为我可以用str[1:-1]解决这个问题,但我仍然遇到问题。

Python中是否有办法将其删除或转换,或将其替换为正确的字符以便将其删除?

示例:一旦我从iPhone中取出二进制文件,我想在其上运行file,但最后存在ESC char,意味着shell无法找到该文件。

编辑:添加了一些代码以便进一步排除故障,以防它不是ESC char

#grabbing the binary name
binName = dlg.actListBox.GetStringSelection()
binName = binName.replace('\x27', '')
binName = binName[1:-1]

#trying to run file
cmd = "file " + appBinPath + "/" + binName
p = subprocess.Popen(cmd, shell=True,stdout=subprocess.PIPE)
stdout = p.communicate()[0]
self.progressBox.AppendText(stdout)


#output I get in program is:
 /Users/p/Documents/ios/output/myapp/myapp_decrypt/Payload/myapp.app/myapp: cannot open `/Users/p/Documents/ios/output/myapp/myapp_decrypt/Payload/myapp.app/myapp' (No such file or directory)

但是,如果我复制上面的路径,并在终端中输入file [path]并按Enter键,我首先会收到一个终端的嘟嘟声(由于ASCII 27字符而我猜测)但是在第二个按下file命令工作正常,这样路径肯定是正确的。

#manual file cmd with same path as used by program
file /Users/p/Documents/ios/output/myapp/myapp_decrypt/Payload/myapp.app/myapp

/Users/p/Documents/ios/output/myapp/myapp_decrypt/Payload/myapp.app/myapp: Mach-O 64-bit executable

已解决:在评论中使用下面列出的repr()功能,我们可以查看字符串中的内容。来自PM2Ring的评论:ESC为\x1b且标准.replace()解决了此问题

1 个答案:

答案 0 :(得分:1)

ESC字符为ASCII 27,十六进制为0x1B。所以从你可以做的binName字符串中剥离ESC字符

binName = binName.replace('\x1b', '')

正如Martijn Pieters在评论中提到的,除非你特别需要shell功能,否则通常最好避免在shell=True调用中subprocess。相反,将命令名称和命令args作为字符串列表传递并使用shell=False,或者只是不要传递shell arg,因为False是默认值。有关详细信息,请参阅Actual meaning of 'shell=True' in subprocess以及与该页面相关的问题。

相关问题