flexicon
flexicon is a library for accessing FieldWorks Language Explorer (FLEx) [1] projects.
flexicon handles the necessary initialisation of the FLEx engine, and provides a class (FLExProject) for opening a FLEx project and working with its contents.
For the GUI application that runs Python scripts/plugins on FLEx databases see FLExTools [2].
Requirements
Python 3.8 - 3.13.
Python for .NET [3] version 3.0.3+.
FieldWorks Language Explorer 9.0.17 - 9.3.1.
32-bit vs 64-bit
The Python architecture must match that of FieldWorks. I.e. Install 32-bit Python for 32-bit Fieldworks, and 64-bit Python for 64-bit Fieldworks.
Installation
Run: pip install pyflexicon
Documentation
Full API documentation is published at https://flexicon.langtech.cloud.
The rendered HTML API help is also bundled and accessible from Python via flexicon.APIHelpFile.
Every GetAll returns a loop/len()/index/re-iterate-able collection regardless of its concrete type (EnumerableWrapper, list, or a SmartCollection subtype) – see docs/getall-contract.md for the full guarantee.
Usage
Basic usage:
import flexicon
flexicon.FLExInitialize()
p = flexicon.FLExProject()
p.OpenProject('parser-experiments')
p.GetPartsOfSpeech()
# ['Adverb', 'Noun', 'Pro-form', 'Pronoun', 'Verb', 'Copulative verb', 'Ditransitive verb', 'Intransitive verb', 'Transitive verb', 'Coordinating connective']
# The API documentation is an HTML file
os.startfile(flexicon.APIHelpFile)
...
p.CloseProject()
flexicon.FLExCleanup()
Version 2.0+ Operations Classes
Version 2.0 introduces comprehensive Operations classes providing CRUD (Create, Read, Update, Delete) methods for all major FLEx data types. These are organized into topic areas matching FLEx’s structure:
Grammar: Parts of Speech, Phonemes, Grammatical Categories, Morphology
Lexicon: Entries, Senses, Examples, Pronunciations, Variants, Etymology
Texts & Words: Texts, Wordforms, Analyses, Paragraphs, Segments
Notebook: Notes, People, Locations, Anthropology data
Lists: Publications, Agents, Overlays, Possibility Lists
System: Writing Systems, Custom Fields, Project Settings
Example usage:
import flexicon
flexicon.FLExInitialize()
project = flexicon.FLExProject()
project.OpenProject('MyProject', writeEnabled=True)
# Create a new lexical entry
entry = project.LexEntry.Create("run", "stem")
# Add a sense with gloss
sense = project.LexEntry.AddSense(entry, "to move rapidly on foot")
project.Senses.SetGloss(sense, "run", "en")
# Set part of speech
verb = project.POS.Find("Verb")
project.Senses.SetPOS(sense, verb)
# Add an example sentence
example = project.Examples.Create(sense,
"The dog runs in the park.", "en")
project.CloseProject()
flexicon.FLExCleanup()
All v1.x API methods remain available for backward compatibility.
What’s New in v2.2
Version 2.2 introduces Wrapper Classes and Smart Collections that simplify working with polymorphic types in FieldWorks. These eliminate the need for manual type checking and casting.
Key Features:
Automatic Type Casting: No more checking ClassName or casting to concrete types
Smart Collections: Type-aware display showing diversity of data
Convenience Filters: Easy filtering without manual type checks
Capability-Based API: Check what’s available instead of checking type
Zero Breaking Changes: All existing code continues to work
Example - Phonological Rules (v2.2):
from flexicon import FLExProject
from flexicon.wrappers import PhonologicalRule
project = FLExProject()
project.OpenProject('MyProject')
# Get all rules - returns smart collection with wrapped objects
rules = project.PhonologicalRuleOperations().GetAll()
# Type-aware display
print(rules) # Shows: PhRegularRule: 7, PhMetathesisRule: 3, etc.
# Convenience filters
regular_rules = rules.regular_rules
metathesis_rules = rules.metathesis_rules
# Transparent property access across types
for rule in rules:
if rule.has_output_specs:
print(f"Outputs: {rule.output_segments}")
if rule.has_metathesis_parts:
print(f"Metathesis: {rule.left_part}, {rule.right_part}")
Currently Supported Domains:
Grammar: Phonological Rules, Phonological Contexts
Lexicon: Morphosyntactic Analyses (MSAs)
More domains coming in v2.3+
Migration Guide: See MIGRATION.md for detailed examples comparing old and new API.
Exported Helpers
Alongside the Operations classes, flexicon exports a few small helpers for working with LCM objects directly.
wrap / unwrap / PythonicWrapper – suffix-free property access. wrap(obj).AlternateForms finds AlternateFormsOS for you, so you do not have to remember which of the OS / OC / OA / RS / RC / RA suffixes a given field carries. Note that wrap does not cast: it only searches suffix variants of a name on the object it is given.
cast_to_concrete – the escape hatch for 'ICmObject' object has no attribute 'X':
from flexicon import cast_to_concrete
# ComponentLexemesRS legally mixes ILexEntry and ILexSense elements, so
# the CLR hands them back typed as the base interface and HeadWord is
# unreachable. cast_to_concrete repairs that.
for component in entry.EntryRefsOS[0].ComponentLexemesRS:
concrete = cast_to_concrete(component)
headword = getattr(concrete, "HeadWord", None) # entries only
if headword is not None:
print(headword.Text)
flexicon’s own Operations classes cast internally, so you will rarely need this – it is there for direct-LCM work and for collections that stay legitimately polymorphic.
cast_to_concrete is total: an object whose ClassName is not recognised, an object with no ClassName, and a cast that fails inside the CLR all yield the original object, unchanged. That is why it is preferable to the from SIL.LCModel import ILexEntry; ILexEntry(x) workaround, which throws the moment x is legitimately an ILexSense. Because the result may be the uncast original, guard derived-member access with hasattr or getattr(..., None) as above.
Contract Testing
A pre-commit hook verifies that LibLCM API dependencies stay consistent as you develop. On machines with FieldWorks installed, the full suite checks every type and member flexicon depends on and detects regressions across LibLCM upgrades.
Setup: python hooks/install.py
See Contract Testing Guide for details.
Release files for pyflexicon 4.10.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pyflexicon-4.10.0.tar.gz | 1.1 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyflexicon-4.10.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 2.1 MB
Release files / pyflexicon-4.10.0.tar.gz
| Download URL | pyflexicon-4.10.0.tar.gz |
|---|---|
| Size | 1.1 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f047b0075d89fb81c83d12aa0f1f88fb4beb5d3eff1e3d2ec4cf9bd43308999f
|
|
BLAKE2b-256 checksum How to use checksums |
aa41dacdb480262336462fab8815445eeeab570ede29e80e305f05bac7168dcd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / pyflexicon-4.10.0-py3-none-any.whl
| Download URL | pyflexicon-4.10.0-py3-none-any.whl |
|---|---|
| Size | 989.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
033a83fa4db1fc750efff27895c773feae91164bfa0168f7da4aa86a637e3dea
|
|
BLAKE2b-256 checksum How to use checksums |
d4e9a9724e670334d32d47ac0426610f5908a23aa3f9569e58fb93a009aed371
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency log