所以,我正在制作一个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托盘,因此无法使用。
如何才能正确弹出光盘?
答案 0 :(得分: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
时,没有shell可以将参数分开;你明确地传递了它们。所以,如果你这样做:
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)
但这通常不是你想要的,在这种情况下它不是你想要的。
答案 1 :(得分:0)
你没有使用cdrecord,而是一个名为“wodim”的错误叉子 可能是你遇到问题的原因。
我建议您使用最近的原始软件: