Moderators Spect~ Δημοσ. 28 Ιουνίου 2016 Moderators Δημοσ. 28 Ιουνίου 2016 Θελω να φτιαξω κατι στην Python και χρησιμοποιώ μια εντολη απο command line αλλα εχω θεμα με το output , πιο αναλυτικα με αυτη την εντολη το output ειναι κενο driveStr = subprocess.check_output("wmic logicaldisk get DeviceID, volumename").decode("utf-8") με αυτη την εντολη το Output ειναι σε bytesμπορω να το παρω σε String μορφη αλλα για να φτιαξω μετα ενα dictionary που θα αντιστοιχω γραμμα σε ονομα θα πρεπει να κανω ταρζανιες στο string. driveStr = subprocess.check_output("wmic logicaldisk get DeviceID, volumename") Παράθεση b'DeviceID VolumeName \r\r\nC: \r\r\nD: Local Disk \r\r\nE: SlimLine \r\r\n\r\r\n' Υπαρχει καποιος τροπος να παρω ενα σωστο output?
jolibred Δημοσ. 29 Ιουνίου 2016 Δημοσ. 29 Ιουνίου 2016 d = { ii[0]: ii[1] for ii in [ i.strip().split(':') for i in subprocess.check_output( 'wmic logicaldisk get DeviceID, volumename' ).decode('utf-8').split()[1:] ] }
Moderators Spect~ Δημοσ. 29 Ιουνίου 2016 Μέλος Moderators Δημοσ. 29 Ιουνίου 2016 και μια εξηγηση τι κανεις και γιατι! που παρεμπιπτόντως μου βγαζει error και στις 2 γραμμες
jolibred Δημοσ. 29 Ιουνίου 2016 Δημοσ. 29 Ιουνίου 2016 Λάθος μου. Δεν είδα καλά και δεν κατάλαβα ότι: Το split() θα σου πετάξει και το 'volumename' (άρα το split()[1:] θέλει split()[2:]) Δεν έχεις σε κάθε γράμμα για drive ένα όνομα.
akis_fc Δημοσ. 29 Ιουνίου 2016 Δημοσ. 29 Ιουνίου 2016 Γιατί το κάνεις decode από ut8? Είσαι σίγουρος ότι την τρέχεις αυτή την εντολή από περιβάλλον που το locale είναι utf8? Edit γραψε άκυρο τώρα είδα windows δεν έχω ιδέα τι παίζει με το encoding σε windows Πάντως αν είναι το ίδιο με λίνουξ δοκίμασε να κάνεις decode με sys.stdout.encoding
Moderators Spect~ Δημοσ. 29 Ιουνίου 2016 Μέλος Moderators Δημοσ. 29 Ιουνίου 2016 δεν εχει να κανει με τα windows. Python 3 επιστρεφει byte και οχι string. Θυμαμαι ειχα το ιδιο θεμα σε μια εργασια και πηρε αρκετς ωρες για να βρουμε το προβλημα @jolibred εξακολυθει να μου πεταει out of range error αλλα επισης δεν καταλαβαινω και τι κανεις. Btw με ταρζανια μπορεσα και γω να το βαλω σε array αλλα τωρα πρεπει να βρω τροπο ωστε να αντιστοιχει σωστα γραμμα-ονομα γιατι δεν εχουν ολα και εκει γινεται μαλακια
jolibred Δημοσ. 29 Ιουνίου 2016 Δημοσ. 29 Ιουνίου 2016 Το σωστό encoding το παίρνεις με: import sys print(sys.stdout.encoding) 1
akis_fc Δημοσ. 29 Ιουνίου 2016 Δημοσ. 29 Ιουνίου 2016 Οκ δες το 2ο εδιτ και δοκίμασε στο decode να βάλεις σαν παράμετρο το sys.stdout.encoding
jolibred Δημοσ. 29 Ιουνίου 2016 Δημοσ. 29 Ιουνίου 2016 και όλο: from __future__ import print_function import sys from collections import defaultdict driveStr = subprocess.check_output( 'wmic logicaldisk get DeviceID, volumename' ).decode(sys.stdout.encoding).split()[2:] i = 0 d = defaultdict(str) while(i < len(driveStr)): if driveStr[i].endswith(':'): d[driveStr[i].split(':')[0]] = driveStr[i+1] if not driveStr[i+1].endswith(':') \ else None i = i + 2 if d[driveStr[i].split(':')[0]] else 1 else: i += 1 [print('Drive {} with name {}'.format(k, v)) for k, v in d.items()] output: Drive C with name None Drive E with name SlimLine Drive D with name Local
Moderators Spect~ Δημοσ. 29 Ιουνίου 2016 Μέλος Moderators Δημοσ. 29 Ιουνίου 2016 Δουλευει σε ενα βαθμο. Κατα καποιο τροπο το εχω κανει και γω αυτο -αν και με διαφορετικο τροπο. Το θεμα ειναι οτι οπως το χεις σε περιπτωση που υπαρχει ονομα δισκου E: (οπου E Οποιοδηποτε γραμμα) τοτε κολλαει και δεν κανει τιποτα
jolibred Δημοσ. 29 Ιουνίου 2016 Δημοσ. 29 Ιουνίου 2016 Ξαναδες το μήνυμά μου μήπως έπεσες πάνω στα edit. Λειτουργεί μία χαρά. Δες το νέο output. Με python version 2.7
Moderators Spect~ Δημοσ. 29 Ιουνίου 2016 Μέλος Moderators Δημοσ. 29 Ιουνίου 2016 Αν και ακομη ειμαι μπερδεμενος με το τι κανεις εχει οτι ειπα και πριν 1)αν ενας δισκος εχει ονομα της μορφης Ε: (πχ αντι για Local Disk E: εχεις E: E:) τοτε κολλαει και 2)οταν το ονομα εχει κενο ενδιαμεσα εμφανιζει μονο την πρωτη λεξη
jolibred Δημοσ. 29 Ιουνίου 2016 Δημοσ. 29 Ιουνίου 2016 from __future__ import print_function import sys from collections import defaultdict driveStr = subprocess.check_output( 'wmic logicaldisk get DeviceID, volumename' ).decode(sys.stdout.encoding).split('\n')[:-1] i = 0 d = defaultdict(str) while i < len(driveStr): tmp = driveStr[i].strip().split(':') if len(tmp) > 1: d[tmp[0]] = tmp[1].strip() if tmp[1] else None i += 1 [print('Drive {} with name {}'.format(k, v)) for k, v in d.items()] Με driveStr = 'DeviceID VolumeName \r\r\nC: \r\r\nD: Local Disk \r\r\nE: SlimLine \r\r\n\r\r\n' output: Drive C with name None Drive E with name SlimLine Drive D with name Local Disk
Moderators Spect~ Δημοσ. 29 Ιουνίου 2016 Μέλος Moderators Δημοσ. 29 Ιουνίου 2016 Δεν παει πιο απλο και δουλευει παντα. Αν και παιζει μονο σε 2.7 και οχι σε 3.x που δουλευω import subprocess drives = {} driveStr = str(subprocess.check_output("wmic logicaldisk get DeviceID, volumename"))[25:-1].replace('\r','').replace(' ','').split('\n') for i in range(0,len(driveStr)-1): drive_letter = driveStr[i][:1] drives[drive_letter] = driveStr[i][2:] print(drives) Και για καποιο λογο η τελευταια σου απαντηση δεν μου δουλευ καν. Δεν δινει καποιο output και δειχνει οτι δεν τελειωνει ποτε η διεργασια
jolibred Δημοσ. 29 Ιουνίου 2016 Δημοσ. 29 Ιουνίου 2016 OK, my bad. Μην κάνεις τίποτα από τα παραπάνω. Ακολούθησε το απλό που δουλεύει πάντα.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα