python , flask による自作のプログラムが動かなくなりました。
所詮は自作なので。
最近、linux mint 20.3 をクリーンインストールしたので、flask がどこの行ったのかわからなくなりました。
でも単純な構造なので、エラーの箇所がすぐにわからないといけません。
調べてみるととても単純なエラーではありました。
no such file or directory
いつものエラーコードです。
多分、プログラムで指定した箇所に dicom ファイルがないんでしょう。
flask では ftp で dicom ファイルをローカルにダウンロードするようになっています。
そもそも ftp があまり良くわかっていません。
ftp でログインしてみます。
ftp>
open 192.168.0.11
ユーザー名とパスワードを入力してログインしてリストを見ると、すぐに pDICOM が見えています。
このディレクトリに dicom ファイルが入っています。
drwxrwxrwx 1 1000 1000 4096 Apr 30 21:40 web
d--------- 1 root root 4096 May 24 15:28 video
drwxrwxrwx 1 138862 138862 4096 Apr 6 16:02 photo
d--------- 1 root root 4096 May 07 2020 music
d--------- 1 root root 4096 May 27 20:14 document
d--------- 1 root root 4096 May 21 07:42 backup
drwxrwxrwx 1 root root 4096 May 21 23:20 temp
drwxrwxrwx 1 root root 4096 May 19 08:31 pDICOM
drwxrwxrwx 1 root root 4096 Apr 11 2021 NetBackup
drwxrwxrwx 1 root root 4096 Dec 30 2021 homes
でも、この構造をちゃんと理解していなかったので、データベースの内容は以下のような感じです。
studyID path
8196 /volume1/pDICOM/2019/02/01
8194 /volume1/pDICOM/2019/02/01
8195 /volume1/pDICOM/2019/02/01
8200 /volume1/pDICOM/2019/02/01
8201 /volume1/pDICOM/2019/02/01
この「/volume1/」を取って、path のあとに studyID をくっつけたい。
いろいろとクエリ
サブクエリを入れ子にすると、とても混乱するので簡単なところから少しずつ複雑にします。
SELECT
studyID AS tmpstudy, CONCAT(path,'/',studyID) AS tmpath
FROM
taginfo
これで、tmpath に「/volume1/pDICOM/2019/02/01/8196」という文字列が入ります。
次は、replace によって「/volume1/」を取り除きます。
SELECT tmpstudy, REPLACE(tmpath, '/volume1/', '') AS rpl FROM
(
SELECT
studyID AS tmpstudy, CONCAT(path,'/',studyID) AS tmpath
FROM
taginfo
) AS aa
そうすると、rpl には「pDICOM/2019/02/01/8196」がセットされます。
次は、抽出した結果を tblB として update します。
UPDATE taginfo,
(
SELECT tmpstudy, REPLACE(tmpath, '/volume1/', '') AS rpl FROM
(
SELECT
studyID AS tmpstudy, CONCAT(path,'/',studyID) AS tmpath
FROM
taginfo
) AS aa
) tblB
SET taginfo.path2=tblB.rpl
WHERE taginfo.studyID=tblB.tmpstudy
このようにすると、path2 には「pDICOM/2019/02/01/8196」という文字列が書き込まれます。
python を書き換える
データベースを上のようにすると、プログラム的にシンプルになりエラー混入が減少すると思います。
プログラム的には、
startWeasis.py
import os
import shutil
import pymysql
from ftplib import FTP
def weasis(studyID):
targetDir = getPath( studyID )
print(targetDir)
if os.path.exists('/tmp/dcmtemp'):
shutil.rmtree('/tmp/dcmtemp')
os.mkdir('/tmp/dcmtemp')
dwn(targetDir)
os.system('javaws /var/www/html/weasis/weasisStart.jnlp')
def getPath( studyID ):
conn = pymysql.connect( host='192.168.0.102',
db='pydcmdb',
user='heno',
password='moheno',
cursorclass=pymysql.cursors.DictCursor)
try:
with conn.cursor() as cursor:
cursor.execute( "SELECT path2 FROM taginfo WHERE studyID = %s", (studyID), )
res = cursor.fetchone()
return res['path2']
finally:
conn.close()
def dwn(dir):
ftp = FTP(
"ipaddress",
'ftpuser',
passwd='ftp_pass'
)
ftp.cwd(dir)
files = ftp.nlst('.')
for file in files:
with open('/tmp/dcmtemp/' + file, 'wb') as f:
ftp.retrbinary('RETR %s' % file, f.write)
ftp.quit()
if __name__ == '__main__':
weasis()
dicom ファイルは「/tmp/dcmtemp」にダウンロードされます。
コマンド ‘javaws’ が見つかりません
もう一つ気をつけるべきなのは、weasis が起動しないことです。
javaws /var/www/html/weasis/weasisStart.jnlp
で起動しないときは、java 8 くらいを用意して以下のようにすればおそらく上のコマンドが起動します。
source /etc/profile
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "$JAVA_HOME/bin/javaws" 1
sudo update-alternatives --set javaws $JAVA_HOME/bin/javaws
セキュリティをあまり気にしなければ、dcm4chee-arc よりはよほど簡単です。