When the Anki application is open on the desktop, it places a lock on the sqlite3 database such that it can’t be queried by another process. One workaround is to try to open the database and if it fails, then make a temporary copy and query that. Of course, this only works with read-only queries. Here’s the basic strategy:
#!/usr/local/bin/python3 # -*- coding: utf-8 -*- # requires python >= 3.8 to run because of anki module from anki import Collection, errors if __name__ == "__main__": try: col = Collection(path_to_anki_db) except (errors.DBError: # anki is open, copy to temp file import tempfile import shutil import os with tempfile.TemporaryDirectory() as tmpdir: dst = os.path.join(tmpdir, 'collectiontemp.anki2') shutil.copy(COLLECTION_PATH, dst) col = Collection(dst) # do something with Anki db
Note that the
tempfile context manager will discard the database, if there are actions on the collection that are common to the Anki-is-open and Anki-is-not-open paths then those should be abstracted to separate function.