Moderators Spect~ Δημοσ. 29 Ιουνίου 2016 Μέλος Moderators Δημοσ. 29 Ιουνίου 2016 Ναι ναι. Ετσι και αλλιως μια μαλακια για μενα θελω να δοκιμασω να φτιαξω οποτε δεν με νοιαζει να ναι και 100% σωστα απο αποψη κωδικα αρκει να δουλευει. Οταν το φτιαξω κοιταω μηπως το συμαζεψω! Ευχαριστω για το χρονο σου!
pmav99 Δημοσ. 29 Ιουνίου 2016 Δημοσ. 29 Ιουνίου 2016 http://stackoverflow.com/questions/16175192/command-output-parsing-in-python
jolibred Δημοσ. 29 Ιουνίου 2016 Δημοσ. 29 Ιουνίου 2016 Ακόμα πιο μικρό from __future__ import print_function from sys import stdout from subprocess import check_output [ print('Drive {} with name {}'.format(k, v)) for k, v in { i.strip().split(':')[0]: i.strip().split(':')[1].strip() for i in check_output( 'wmic logicaldisk get DeviceID, volumename' ).decode(stdout.encoding).split('\n')[:-1] if len(i.strip().split(':')) > 1 }.items() ] Tested με output από subprocess.check_output(): '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 Drive E with name SlimLine Drive D with name Local Disk Ναι ναι. Ετσι και αλλιως μια μαλακια για μενα θελω να δοκιμασω να φτιαξω οποτε δεν με νοιαζει να ναι και 100% σωστα απο αποψη κωδικα αρκει να δουλευει. Οταν το φτιαξω κοιταω μηπως το συμαζεψω! Ευχαριστω για το χρονο σου! Επειδή δεν έχω windows, δοκίμασε μία το τελευταίο. Εάν δεν δουλέψει, δώσε το string με το οποίο δεν σου δουλεύει.
pmav99 Δημοσ. 29 Ιουνίου 2016 Δημοσ. 29 Ιουνίου 2016 Γράψτε 2 γραμμές παραπάνω και κοψτε τις αηδίες. Python γράφετε , οχι Perl
Moderators Spect~ Δημοσ. 29 Ιουνίου 2016 Μέλος Moderators Δημοσ. 29 Ιουνίου 2016 Θα το κοιτάξω αύριο γιατί έκλεισα τον υπολογιστή. Η λύση μου μια χαρά δουλεύει όπως πρέπει οπότε είμαι καλυμμένος
jolibred Δημοσ. 29 Ιουνίου 2016 Δημοσ. 29 Ιουνίου 2016 Η λύση σου είναι για τα μπάζα... αλλά μην το πεις πουθενά. Ειδικά αυτό το [25:-1] είναι.... όπως το replace('\r', '') και το replace(' ', '') Π.χ. είχες θέμα ότι έλειπε το 2ο μέρος ονόματος όταν αυτό ήταν (π.χ.) Local disk. Με το replace(' ', '') γίνεται Localdisk. Εικάζω ότι χάθηκες κάπου στο c/p από εδώ και για αυτό δεν σου δούλεψαν... ειδικά αυτό με τα endless loops πρέπει να ήταν θέμα indentation στο code εδώ στο insomnia.
Moderators Spect~ Δημοσ. 29 Ιουνίου 2016 Μέλος Moderators Δημοσ. 29 Ιουνίου 2016 Μα το είπα και Εγώ ότι είναι ταρζανια απλά για να δουλέψει για τώρα. Όσο για το κενό στο όνομα μου το χάλασες αλλά μου κάνει και έτσι. Θα το ξαναδώ αύριο με καθαρο κεφάλι πιο αναλυτικά. Όσο για τις replace είναι απλά για να καθαρίσω τις πληροφορίες που χρειάζομαι από περιττές πληροφορίες
jolibred Δημοσ. 29 Ιουνίου 2016 Δημοσ. 29 Ιουνίου 2016 Εικάζω ότι και εάν έχεις ελληνικά ως όνομα δίσκου πάλι δεν θα δουλέψει. Btw, το "χωρίς κενό" το κάνει η λύση σου, λόγω του replace(' ', '').
the other one Δημοσ. 29 Ιουνίου 2016 Δημοσ. 29 Ιουνίου 2016 Χωρίς να έχω καταλάβει 100% τι έχεις κάνει εκεί, να ρωτήσω γιατί να το κάνεις με ένα τεράστιο list comprehension; πιο readable δε θα ήταν με 2 απλές for;
Moderators Spect~ Δημοσ. 29 Ιουνίου 2016 Μέλος Moderators Δημοσ. 29 Ιουνίου 2016 @jolibred κοιταψα μολις το τελευταιο κωδικο που ποσταρες και δουλευει κανονικα αλλα ειμαι λιγο χαμενος στο πως το κανει. Αν μπορεις οταν εχεις λιγο χρονο να γραψεις στα γρηγορα τι κανεις για να καταλαβω οχι τιποτα να μαθω για την επομενη φορα! Thank you for your time sir! Επισης αλλαξα λιγο τον κωδικα μου γιατι τα κανεις ολα μαζεμενα και καπου χανομαι στο τι κανεις. Το εκανα ξανα με δικο μου τροπο ωστε να καταλαβω και τι κανω μεχρι να μου εξηγησεις στο output_list περναω το αποτελεσμα της εντολης. το splitlines()τα χωριζει σε γραμμες και το 2: διαγραφει το DeviceID και Volumename απο το καθαρο output Που ειναι ['DeviceID VolumeName ', '', 'C: ', '', 'D: Local Disk ', '', 'E: SlimLine ', '', '', ''] επιστρεφει αυτο (μπορω να βαλω [2:-3] για να σβησει και τα τελευταια "strings" μετα το SlimLine αλλα επειδη δεν ξερω αν θα ειναι παντα ετσι το output το αφηνω. Στη συνεχεια ξεσκαρταρει τα κενα οποτε δεν με ενοχλει. ['C: ', '', 'D: Local Disk ', '', 'E: SlimLine ', '', '', ''] αφου τα εχω στη λιστα μετα τρεχω μια λουπα και για καθε αντικειμενο το βαζω σε μια temp λιστα οπου χωριζεται με το : σε γραμμα και ονομα. Αν το γραμμα δεν ειναι κενο (εδω ξεσκαρταρει ολα τα κενα αντικειμενα στη λιστα τοτε κοιταει το ονομα Αν δεν εινα κενο (αφου εχει διαγραψει ολα τα κενα) τοτε το βαζει στη λιστα με Key το γραμμα και value το Ονομα αλλιως αν το ονομα ειναι κενο βαζει σαν value το None from subprocess import check_output drives = {} output_list = check_output('wmic logicaldisk get DeviceID, volumename').splitlines()[2:-3] for drive in range(0, len(output_list)): drive_details_list = output_list[drive].split(":") drive_letter = drive_details_list[0] if drive_letter: drive_name = drive_details_list[1].strip() if drive_name: drives[drive_letter] = drive_name else: drives[drive_letter] = 'None' Τωρα εχω αλλη μια ερωτηση αλλα ασχετη με το προηγουμενο. Θελω το σκριπτακι να τρεχει στο background και καθε φορα που συνδεεται ενα στικακι/δισκος/κινητο να τρεχει ενα συγκεκριμενο κομματι του κωδικα. Πως σκατα θα το κανω αυτο!? Στο ιντερνετ διαβαζα για αλλαγες στο autorun απο το στικακι αλλα δεν βολευει γιατι θελω να μην χρειαζεται να ασχοληθω με το στικακι καθολου. Σκεφτηκα μια πολυ μπακαλιστικη λυση αλλα θελω κατι καλυτερο. Αυτο που σκεφτηκα και δουλευει αν και ειναι ταρζανια παλι ειναι να τρεχει μια while οσο ο αριθμος των standard δισκων ειναι ιδιος με το outuput της εντολης. Οταν συνδεεται νεα συσκευη αλλαζει και δουλυει κανονικα αλλα δεν ειναι ο σωστος τροπος. Αυτο που θελω ουσιαστικα ειναι να τρεχει το script στο background και οταν συνδεθει ενα στικακι να τρεξει μια συναρτηση
jolibred Δημοσ. 29 Ιουνίου 2016 Δημοσ. 29 Ιουνίου 2016 Χωρίς να έχω καταλάβει 100% τι έχεις κάνει εκεί, να ρωτήσω γιατί να το κάνεις με ένα τεράστιο list comprehension; πιο readable δε θα ήταν με 2 απλές for; Δεν είναι μόνο list comprehension. @jolibred κοιταψα μολις το τελευταιο κωδικο που ποσταρες και δουλευει κανονικα αλλα ειμαι λιγο χαμενος στο πως το κανει. Αν μπορεις οταν εχεις λιγο χρονο να γραψεις στα γρηγορα τι κανεις για να καταλαβω οχι τιποτα να μαθω για την επομενη φορα! from sys import stdout from subprocess import check_output driveStr = check_output( 'wmic logicaldisk get DeviceID, volumename' ).decode(stdout.encoding) split_driveStr = driveStr.split('\n')[:-1] d = {} for split_str in split_driveStr: i = split_str.strip().split(':') if len(i) > 1: d.update({i[0]: i[1]})
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα