因此,我正在制作一个cd刻录应用程序,我需要弹出驱动器,让用户将磁盘放入其中。这有点复杂,但我遇到的最简单的情况是这样的;我可以通过命令行使用cdrecord来弹出cd托盘,使用以下命令:
cdrecord --eject dev='/dev/sg1'这应该意味着我可以用subprocess.call做同样的事情,如下所示:
subprocess.call(["cdrecord", "--eject", "dev='/dev/sg1'"])然而,当我这样做的时候,我得到了这个错误:
wodim: No such file or directory.
Cannot open SCSI driver!
For possible targets try 'wodim --devices' or 'wodim -scanbus'.
For possible transport specifiers try 'wodim dev=help'.
For IDE/ATAPI devices configuration, see the file README.ATAPI.setup from
the wodim documentation.托盘打不开。
这与我以前尝试从命令行运行它时得到的错误非常相似,但我通过加载sg内核模块修复了这个错误。
如果我只是运行:
subprocess.call(["cdrecord", "--eject"])它可以很好地打开托盘。然而,这需要与可能的多个cd托盘一起工作,所以这将不起作用。
我怎样才能让它正确弹出光盘?
发布于 2012-09-26 05:56:13
试试这个:
subprocess.call(["cdrecord", "--eject", "dev=/dev/sg1"])shell将负责解释引号,但cdrecord不会。
首先需要使用引号的唯一原因是,dev路径中可能包含空格,这会导致shell将所有内容拆分为单独的参数。例如,如果您键入以下内容:
cdrecord --eject dev=/dev/my silly cd namecdrecord的参数将是--eject、dev=/dev/my、silly、cd、name。但是如果你这样做:
cdrecord --eject dev='/dev/my silly cd name'cdrecord的参数将是--eject,dev=/dev/my silly cd name。
当您使用subprocess.call时,不需要外壳来拆分参数;您需要显式地传递它们。所以,如果你这样做:
subprocess.call(["cdrecord", "--eject", "dev=/dev/my silly cd name"])cdrecord的参数将是--eject,dev=/dev/my silly cd name。
在某些情况下--例如,因为你一开始就把事情弄得一团糟(例如,你正在读取一个配置文件,这个配置文件应该由你的程序使用或者由外壳程序执行),-you实际上别无选择,只能在外壳中运行。如果发生这种情况,请执行以下操作:
subprocess.call("cdrecord --eject dev='/dev/sg1'", shell=True)但这通常不是您想要的,在这种情况下也不是您想要的。
发布于 2013-12-10 01:03:49
你使用的不是cdrecord,而是一个叫做"wodim“的but fork,这可能是你出现问题的原因。
我建议您使用最新的原创软件,其网址为:
ftp://ftp.berlios.de/pub/cdrecord/alpha/
https://stackoverflow.com/questions/12591606
复制相似问题