LoginSignup
0
0

More than 5 years have passed since last update.

ArcGISのツールを作る際に発生した怪奇現象

Last updated at Posted at 2018-03-17

これの話
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);

なぜ件数に応じて再現性が変わるかは謎です。。。:question::question:
もしかしたらデータ構造化も知れませんがそれでも謎です。:question::question:

ロックへの対処

処理を進めるとarcpy.Delete_management(sqlite_file)はちゃんと通ることからArcMapはちゃんと管理しており、「おめーに使わせねーわ」という状態のようです。
(´-`).。oO( jャイアンかよ、畜生:persevere:

英語でいろいろ情報はあるのですがdelete arcpyでインポートしたパッケージを一回クリアするとか色々面白いです。
arcpy.disconnectみたいなんないんですかね?まじで:anger:

ArcGIS Proはこのツールがあるようですがファイルに有効か分かりません。
http://pro.arcgis.com/ja/pro-app/tool-reference/data-management/clear-workspace-cache.htm

都合、ArcGISが握っているSQLiteファイルを無視して、コピーしましたとさ。

WTF:thumbsdown:

そしてArcGIS Proで試した時、arcpy.Delete_management(sqlite_file)でコケました。
ロックしてんのあんただよ...

たぶんドM:u7981:なのか地縛霊:skull:か何かなんだと思います。

とりあえずtry catchと言う結界を貼って閉じ込めておきましたが、tempフォルダから消すことは出来ませんでしたとさ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0