1717import subprocess
1818import platform
1919
20+ from bs4 import BeautifulSoup
21+
2022try :
2123 from plistlib import loads
2224except ImportError :
@@ -40,7 +42,13 @@ def _plist_from_popen(popen):
4042 if not out :
4143 return []
4244 try :
43- return loads (out )
45+ # Beautiful soup ensures the XML is properly formed after it is parsed
46+ # so that it can be used by other less lenient commands without problems
47+ xml_representation = BeautifulSoup (out .decode ('utf8' ), 'xml' )
48+ if not xml_representation .get_text ():
49+ # The output is not in the XML format
50+ return loads (out )
51+ return loads (xml_representation .decode ().encode ('utf8' ))
4452 except ExpatError :
4553 return []
4654
@@ -85,9 +93,9 @@ def _dfs_usb_info(obj, parents):
8593 """
8694 output = {}
8795 if (
88- "BSD Name" in obj
89- and obj ["BSD Name" ].startswith ("disk" )
90- and mbed_volume_name_match .search (obj ["IORegistryEntryName" ])
96+ "BSD Name" in obj
97+ and obj ["BSD Name" ].startswith ("disk" )
98+ and mbed_volume_name_match .search (obj ["IORegistryEntryName" ])
9199 ):
92100 disk_id = obj ["BSD Name" ]
93101 usb_info = {"serial" : None , "vendor_id" : None , "product_id" : None , "tty" : None }
@@ -177,12 +185,13 @@ def _volumes(self):
177185 if self .mac_version >= 10.11 :
178186 cmp_par = "-c"
179187
188+ usb_tree = []
180189 for usb_controller in usb_controllers :
181190 ioreg_usb = subprocess .Popen (
182191 ["ioreg" , "-a" , "-r" , cmp_par , usb_controller , "-l" ],
183192 stdout = subprocess .PIPE ,
184193 )
185- usb_tree = _plist_from_popen (ioreg_usb )
194+ usb_tree . extend ( _plist_from_popen (ioreg_usb ) )
186195
187196 r = {}
188197
0 commit comments