Home     |     .Net Programming    |     cSharp Home    |     Sql Server Home    |     Javascript / Client Side Development     |     Ajax Programming

Ruby on Rails Development     |     Perl Programming     |     C Programming Language     |     C++ Programming     |     IT Jobs

Python Programming Language     |     Laptop Suggestions?    |     TCL Scripting     |     Fortran Programming     |     Scheme Programming Language


 
 
Cervo Technologies
The Right Source to Outsource

MS Dynamics CRM 3.0

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.

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)

Add to del.icio.us | Digg this | Stumble it | Powered by Megasolutions Inc