Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

  • Moderators
Δημοσ.

Θελω να φτιαξω κατι στην 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?

  • Moderators
Δημοσ.

και μια εξηγηση τι κανεις και γιατι!

 

 

που παρεμπιπτόντως  μου βγαζει error και στις 2 γραμμες

Δημοσ.

Λάθος μου. Δεν είδα καλά και δεν κατάλαβα ότι:

 

Το split() θα σου πετάξει και το 'volumename' (άρα το split()[1:] θέλει split()[2:])

Δεν έχεις σε κάθε γράμμα για drive ένα όνομα.

Δημοσ.

Γιατί το κάνεις decode από ut8? Είσαι σίγουρος ότι την τρέχεις αυτή την εντολή από περιβάλλον που το locale είναι utf8?

 

Edit γραψε άκυρο τώρα είδα windows δεν έχω ιδέα τι παίζει με το encoding σε windows

Πάντως αν είναι το ίδιο με λίνουξ δοκίμασε να κάνεις decode με sys.stdout.encoding

  • Moderators
Δημοσ.

δεν εχει να κανει με τα windows. Python 3 επιστρεφει byte και οχι string. Θυμαμαι ειχα το ιδιο θεμα σε μια εργασια και πηρε αρκετς ωρες για να βρουμε το προβλημα :P

 

@jolibred

 

εξακολυθει να μου πεταει out of range error αλλα επισης δεν καταλαβαινω και τι κανεις. Btw με ταρζανια μπορεσα και γω να το βαλω σε array αλλα τωρα πρεπει να βρω τροπο ωστε να αντιστοιχει σωστα γραμμα-ονομα γιατι δεν εχουν ολα και εκει γινεται μαλακια

Δημοσ.

και όλο:

 

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
Δημοσ.

Δουλευει σε ενα βαθμο. Κατα καποιο τροπο το εχω κανει και γω αυτο -αν και με διαφορετικο τροπο. Το θεμα ειναι οτι οπως το χεις σε περιπτωση που υπαρχει ονομα δισκου E: (οπου E Οποιοδηποτε γραμμα) τοτε κολλαει και δεν κανει τιποτα

  • Moderators
Δημοσ.

Αν και ακομη ειμαι μπερδεμενος με το τι κανεις εχει οτι ειπα και πριν 

1)αν ενας δισκος εχει ονομα της μορφης Ε: (πχ αντι για Local Disk E: εχεις E: E:) τοτε κολλαει και 

2)οταν το ονομα εχει κενο ενδιαμεσα εμφανιζει μονο την πρωτη λεξη

Δημοσ.

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
Δημοσ.

Δεν παει πιο απλο και δουλευει παντα. Αν και παιζει μονο σε 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 και δειχνει οτι δεν τελειωνει ποτε η διεργασια

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...