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"])

シェルは引用符の解釈を処理しますが、処理しcdrecordません。

そもそも引用符が必要な唯一の理由は、devパスにスペースが含まれている可能性があるため、シェルが物事を個別の引数に分割するためです。たとえば、次のように入力した場合:

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、引数を分解するためのシェルはありません。それらを明示的に渡します。したがって、これを行う場合:

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

の引数は、になりcdrecordます。--ejectdev=/dev/my silly cd name

場合によっては、たとえば、最初から絶望的に混乱した状態になっているため(たとえば、プログラムで使用したり、シェルで実行したりすることを目的とした構成ファイルを読んでいる場合)、実際には頼りになりませんが、シェルを実行します。その場合は、次のようにします。

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 に答える