我有一个连接到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()
解决了此问题
答案 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以及与该页面相关的问题。