Help controlling CDROM from python

O

Ognjen Bezanov

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
 
M

MonkeeSage

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
 
M

MonkeeSage

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)
 
R

R. Bernstein

If you want an OS neutral way one may be able to use pycdio from the
Cheese shop.

It requires libcdio to be installed and that sometimes the case if you
have a free media player (like vlc or xine, or mplayer) installed.

I don't really use it all that often so I can't vouch for how good it
is. (Although there *are* regression tests).
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,817
Latest member
DicWeils

Latest Threads

Top