|
|
 |
 |
 |
 |
Python Programming Language
|
 |
 |
 |
 |
 |
 |
 |
 |
Help controlling CDROM from python
Hello, I am trying to control a CD-ROM drive using python. The code I use is shown below.
> import CDROM > from fcntl import ioctl > import os > class Device: > CDdevice="" > CDfd = None > def __init__(self,name): > self.CDdevice = name #we get a device name when module loaded > if self.CDdevice == "": > print "No device specified" > sys.exit(-1) > self.openCD() > def openCD(self): > try: > self.CDfd = open(self.CDdevice, 'r') #open the device and return filedescriptor > except(OSError,IOError): #if there is an OS or IO Error (usually indicates nodisk) > print "Device Error, Halting.... (usually means drive or disk not found)" > sys.exit(-1) > def unlockCD(self): > return self.sendCDcommand(CDROM.CDROM_LOCKDOOR,0) > def ejectCD(self): > self.unlockCD() #we need to unlock the CD tray before we try to eject, otherwise we get an IO Error (#5) > return self.sendCDcommand(CDROM.CDROMEJECT) > def sendCDcommand(self,command,argument=''): > return ioctl(self.CDfd,command,argument)
The code that calls the class is a follows: > import CD_Bindings > CD = CD_Bindings.Device("/dev/cdrom") > print CD.ejectCD()
This works great, but only when there is a disk inside, otherwise we get an error. My issue is that I need to be able to eject the CDROM tray even if there is no disk inside. This is possible because other programs (like the linux "eject" command) can do it. Its just a question of how it is done in python. So I'm posting here in the hope someone can tell me. Thanks, Ognjen
On Mar 10, 8:27 am, Ognjen Bezanov <Ogn@mailshack.com> wrote: > My issue is that I need to be able to eject the CDROM tray even if there > is no disk inside.
Here's a Q&D version (haven't tested the windows part, it's from an old mailing list post, but it looks correct): import os, sys if 'win' in sys.platform: # untested: found in old mailing list post: # http://mail.python.org/pipermail/python-win32/2002-November/000593.html import win32file from win32con import * drive = 'D:' win32file.CreateFile(r'\\.\\' + drive, GENERIC_READ, FILE_SHARE_READ, None, OPEN_EXISTING, 0, 0) # IOCTL_STORAGE_EJECT_MEDIA = 0x002d4808 from <winioctl.h> win32file.DeviceIoControl(h, 0x002d4808, "", 0) win32file.CloseHandle(h) else: # does this work on OSX and BSD? import fcntl cd_device = '/dev/cdrom' if os.path.islink(cd_device): base_path = os.path.dirname(cd_device) cd_device = os.readlink(cd_device) if not cd_device[0] == '/': cd_device = os.path.join(base_path, cd_device) cdrom = os.open(cd_device, os.O_RDONLY | os.O_NONBLOCK) # CDROMEJECT = 0x5309 from <linux/cdrom.h> on linux 2.6 fcntl.ioctl(cdrom, 0x5309, 0) os.close(cdrom) NB: If you're using pygame, you can also just use it's builtin commands: import pygame.cdrom as cdrom cdrom.init() cd = cdrom.CD(0) # 0 = first cdrom device cd.init() cd.eject() cd.quit() cdrom.quit() Regards, Jordan
On Mar 10, 4:11 pm, "MonkeeSage" <MonkeeS@gmail.com> wrote: > win32file.CreateFile(r'\\.\\' + drive, GENERIC_READ, > FILE_SHARE_READ, > None, OPEN_EXISTING, 0, 0)
Oops! That should have been: h = win32file.CreateFile(r'\\.\\' + drive, GENERIC_READ, FILE_SHARE_READ, None, OPEN_EXISTING, 0, 0)
|
 |
 |
 |
 |
|