Skip to main content

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)

Source distribution for pyflexicon 4.10.0
File Size Uploaded
pyflexicon-4.10.0.tar.gz 1.1 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for pyflexicon 4.10.0
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

4.10.0 This release

2 release files

4.9.0

2 release files

4.8.0

2 release files

4.7.0

2 release files

4.6.0

2 release files

4.4.1

2 release files

4.4.0

2 release files

4.3.1

2 release files

4.3.0

2 release files

4.2.1

2 release files

4.2.0

2 release files

4.1.2

2 release files

4.1.1

2 release files

4.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page