2021年12月15日

きょうトライしたけれどできなかった課題。python日記-6

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
for ADAPTER in 0 1 2 3 ; do
NEW_ADAPTER=`expr $ADAPTER + 20`
mkdir /dev/dvb/adapter$NEW_ADAPTER
chown root:root /dev/dvb/adapter$NEW_ADAPTER
chmod 0755 /dev/dvb/adapter$NEW_ADAPTER
/usr/bin/nice --4 /usr/local/bin/fuse_b25 --target \
/dev/dvb/adapter$ADAPTER /dev/dvb/adapter$NEW_ADAPTER \
-o allow_other
done
exit 0

上のシェルスクリプトを、pythonで書けるかやってみました。
このシェルスクリプトは、アースソフトのpt3カードに
使うものです。

ドライバーがインストールされていれば、
カードは、自動的に/dev/dvb/に、apdapter0からapdapter3まで
のデバイスフォルダ(ファイル入り)を生成します。
同じ場所に、+20した番号付きデバイスフォルダを4つ生成し、
ファイルへの権限を設定。続いて、
fuse_b25という実行ファイルを使って、それぞれ
adapter0はadapter20に、adapter1はadapter21に、
というふうに、fuse_b25の実行結果を
+20したデバイスフォルダ(と中身のファイル)に
渡すという流れになっています。

これをpython化してみようとしたのですが、

最後の、fuse_b25が出てくるところのlinuxコマンドを
実行させるやり方がわかりませんでした。その手前でも
エラーが出たりして、、、。

シェルスクリプト側にある、exprは、
計算しろ、みたいなコマンドのようなのですが、
私は、これの解釈が正しくできていないのかもしれません。

pythonで
#!/usr/bin/env python3

import os

os.chdir('/dev/dvb')

for ADAPTER in [0,1,2,4]:
for num in [20,21,22,23]:
dirname = 'adapter' + str(num)
os.makedirs(dirname)
os.chown(dirname, 0, 0)
os.chmod(dirname, 0o755)

と途中までそれっぽくやってみて、実行してみると、

Traceback (most recent call last):
File "/home/user/rc.local.py", line 10, in
os.makedirs(dirname)
File "/usr/lib/python3.9/os.py", line 225, in makedirs
mkdir(name, mode)
FileExistsError: [Errno 17] File exists: 'adapter20'


というようなご指摘が出まして、アタマが止まってしまいました。
フォルダは生成されたのですが、まだfuse_b25以前の問題で
ひかかっています。したがって、
生成されたadpter20〜23のアダプタフォルダは、空です。

すでにフォルダが在る、って云われても、
あるわけなかったはずなのですが。
のっけから牛歩の歩みを強いられました。
まあ、気楽に一日3時間を限度に、勉強していこうと
いまのところは思っています。

↓  ↓  ↓  ↓

os.makedirs(dirname) を 
os.makedirs(dirname, exist_ok= True) に変更して、
エラーなしになりました。

あとは、ややこしいlinuxコマンドを入れ込むだけですが、
むずかしそうですね。


posted by ブログ開設者 at 21:21| Comment(0) | linux | このブログの読者になる | 更新情報をチェックする