通过popen使用cdrecord不会弹出

时间:2012-09-25 21:50:47

标签: python popen

所以,我正在制作一个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托盘,因此无法使用。

如何才能正确弹出光盘?

2 个答案:

答案 0 :(得分:2)

试试这个:

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

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

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

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

cdrecord的论据将是--ejectdev=/dev/mysillycdname。但如果你这样做:

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

cdrecord的论据将是--ejectdev=/dev/my silly cd name

当你使用subprocess.call时,没有shell可以将参数分开;你明确地传递了它们。所以,如果你这样做:

subprocess.call(["cdrecord", "--eject", "dev=/dev/my silly cd name"])

cdrecord的论据将是--ejectdev=/dev/my silly cd name

在某些情况下 - 例如,因为您首先处于无望混淆的状态(例如,您正在阅读一个配置文件,该文件意味着由您的程序使用或由shell执行) - 您真的有没有办法,只能穿过外壳。如果发生这种情况,请执行以下操作:

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

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

答案 1 :(得分:0)

你没有使用cdrecord,而是一个名为“wodim”的错误叉子 可能是你遇到问题的原因。

我建议您使用最近的原始软件:

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