1

所以,我正在制作一个 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 托盘一起使用,所以这不起作用。

我怎样才能让它正确弹出 cd?

4

2 回答 2

2

尝试这个:

subprocess.call(["cdrecord", "--eject", "dev=/dev/sg1"])

shell 将负责解释引号,但cdrecord不会。

首先需要引号的唯一原因是dev路径中可能包含空格,导致 shell 将内容拆分为单独的参数。例如,如果您键入以下内容:

cdrecord --eject dev=/dev/my silly cd name

的参数cdrecord将是--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

在某些情况下——例如,因为你一开始就陷入了无可救药的混乱状态(例如,你正在读取一个打算由你的程序使用或由 shell 执行的配置文件)——你真的没有追索权,但是通过外壳运行。如果发生这种情况,请执行以下操作:

subprocess.call("cdrecord --eject dev='/dev/sg1'", shell=True)

但这通常不是您想要的,在这种情况下也不是您想要的。

于 2012-09-25T21:56:12.950 回答
0

您使用的不是 cdrecord,而是一个名为“wodim”的有问题的叉子,这可能是您出现问题的原因。

我建议您使用来自以下网站的最新原创软件:

ftp://ftp.berlios.de/pub/cdrecord/alpha/

于 2013-12-09T17:03:48.603 回答