これの話
https://qiita.com/MALORGIS/items/dd580684c093ee499b1e
python2/3両対応 ArcMap/Pro両方で動かすものとして作成しているので回避しにくい部分もあるのですが...
再現性のないSQLiteロック
ArcGISからSQLiteにデータを保存して、SpatialiteでデータをいじりたいのでArcPyで適当にコードを書きました。
ArcGISで自動的に追加されるPythonのSQLiteパッケージは古く新しいSpatialiteが使えません。
と言うことでSQLite3.exeを直接使用して処理を実行したい状態です。
またArcPy Toolboxとして作成しているので実行プロセスはArcMap.exeとかになりますしSQLite3は子プロセスとして親プロセス側で管理されます。
再現用のコードです。コマンドラインから実行して
c = msvcrt.getch()
で処理を止めてSQLite 3でSQLを実行するとfc
のレコード数に応じてdatabase is locked
になります。
10件程度のデータでやると何故か起きません。。
import sys
import os
import msvcrt
import arcpy
sqlite_file = r'C:/temp/test.sqlite'
fc = r"C:/temp/JPN.gdb/JPN80_3857_Points"
arcpy.CreateSQLiteDatabase_management(sqlite_file, 'SPATIALITE')
arcpy.env.workspace = sqlite_file
arcpy.arcpy.CopyFeatures_management(fc, 'copyfc')
print('press any key...')
c = msvcrt.getch()
print('you entered', c)
arcpy.Delete_management(sqlite_file)
「press any key...」が出てる間に実行するコマンド
sqlite3 C:\temp\test.sqlite
CREATE TABLE test (id INTEGER PRIMARY KEY);
なぜ件数に応じて再現性が変わるかは謎です。。。
もしかしたらデータ構造化も知れませんがそれでも謎です。
ロックへの対処
処理を進めるとarcpy.Delete_management(sqlite_file)
はちゃんと通ることからArcMapはちゃんと管理しており、「おめーに使わせねーわ」という状態のようです。
(´-`).。oO( jャイアンかよ、畜生)
英語でいろいろ情報はあるのですがdelete arcpy
でインポートしたパッケージを一回クリアするとか色々面白いです。
arcpy.disconnectみたいなんないんですかね?まじで
ArcGIS Proはこのツールがあるようですがファイルに有効か分かりません。
http://pro.arcgis.com/ja/pro-app/tool-reference/data-management/clear-workspace-cache.htm
都合、ArcGISが握っているSQLiteファイルを無視して、コピーしましたとさ。
WTF
そしてArcGIS Proで試した時、arcpy.Delete_management(sqlite_file)
でコケました。
ロックしてんのあんただよ...
たぶんドMなのか地縛霊か何かなんだと思います。
とりあえずtry catch
と言う結界を貼って閉じ込めておきましたが、tempフォルダから消すことは出来ませんでしたとさ。