Phase 0 notes – manual migration on a clone (2026-09-25)¶
Setup¶
conda create -n seamm-pip-test --clone seamm (the production Mac
environment, Python 3.12.13, 366 packages of which 88 were pypi). Then:
conda remove -n seamm-pip-test --force \
molsystem seamm-dashboard seamm-datastore seamm-ff-util seamm-installer \
seamm-util seamm-widgets reference-handler openbabel rdkit psutil pillow
pip install molsystem seamm seamm-datastore seamm-ff-util seamm-installer \
seamm-util seamm-widgets reference-handler openbabel rdkit psutil pillow
reference-handler was added to the list: it is conda-forge in the
production environment but missing from the conda list in
seamm_packaging’s metadata. seamm itself was already a pip-installed
development build in production, so pip reported it as satisfied.
Results¶
All checks pass on the migrated environment (script:
phase0_checks.py, kept in the session scratchpad; recreate from this
list if needed). The same script was run on the untouched seamm
environment first and also passed, so the comparison is like for like.
Check |
Result on migrated env |
|---|---|
import openbabel / rdkit / psutil / PIL / spglib |
OK, all from pip wheels |
openbabel 3D build from SMILES |
OK, openbabel 3.2.1 wheel |
rdkit embed |
OK, rdkit 2026.3.6 wheel |
molsystem SMILES -> OBMol -> RDKMol -> SDF |
OK, molsystem 2026.9.20 |
PIL.ImageTk PhotoImage under conda Tk 8.6 |
OK, Pillow 12.3.0 wheel |
seamm_datastore connect + initialize + login |
OK |
TkFlowchart created headlessly |
OK |
|
no broken requirements |
|
OK (269 conda, ~100 pip entries) |
|
OK |
The ImageTk result settles the main risk in the plan: the pip Pillow wheel binds to the conda-forge Tk without any special handling. Pillow does not need to stay a conda dependency.
Findings that change the plan¶
A targeted conda install is safe; ``conda update –all`` is not.
conda install --dry-run tkon the mixed environment touched onlytkandopenssl: the solver treated the pip copies as satisfying thepillow/rdkitrequirements of the remaining conda packages. Butconda update --all --dry-runproposed 38 new and 228 updated packages, including:a conda ``pillow`` back on top of the pip one (pulled by
matplotlib-baseandreportlab);``bibtexparser`` 1.4.3 -> 2.0.1, straight through the
<2upper bound that four SEAMM packages declare – conda does not read pip constraints;sqlalchemy1.4 -> 2.1,numpy2.2 -> 2.5, and a condapmwover the pippmw.
So the plan’s Phase 5 “base update” must be
conda install python pip tk libsqlite(targeted), neverupdate --all, and the user docs must say so. This is the same two-resolver failure the campaign exists to remove; it persists for as long as conda still owns Python packages.150 conda-managed Python packages remain after moving the seven. They are the transitive dependencies conda pulled in originally (numpy, pandas, matplotlib, sqlalchemy, …). While they exist, conda has something to “update” and finding 1 applies. The clean end state is zero conda Python packages: conda owns
python,pip,tk,libsqliteand their C libraries only. Two ways to get there:Fresh environment (new installs, and the simplest fix for existing ones):
conda create -n seamm python=3.12 pip tkthenpip installthe SEAMM package set. This is what the installer’sseamm.ymlshould become.In-place: force-remove every conda package whose build string is
py312*orpyh*and re-pip installthe SEAMM set so pip re-resolves them. Not tested in Phase 0; the partial removal was.
Recommendation: make the in-place migration in Phase 1 remove all conda Python packages, not just the seven, and offer “recreate the environment” as the documented alternative.
The ``defaults`` channel is leaking into the environment.
create_envinseamm_installer/util.pywriteschannels: conda-forge, defaults. Two packages in production come frompkgs/main:apsw3.51.1.0 andsqlite3.53.2. Thedefaultssqliteand the conda-forgelibsqlite3.53.4 both own ``lib/libsqlite3.dylib``; in production the symlink points at 3.53.4, in the clone it came out pointing at 3.53.2 (the clone re-linked in a different order). Python’ssqlite3module therefore reports a different SQLite version in the two environments. Not caused by pip, but exactly the kind of silent inconsistency the!=3.49.1pin was meant to guard against. Dropdefaultsfromcreate_envand fromseamm.yml; with everything else on pip there is no reason for it.Two packages are missing from the packaging metadata’s conda list.
reference-handleris installed from conda-forge in production but listed nowhere inseamm_packaging’s metadata (it is inseamm_installer/metadata.py’score_packages). It must be in the Phase 1 force-removal set or a conda solve will keep it. The productionseammbeing a pip dev build also means the “seven” is really “six plus whatever the user has” – the migration code should derive the set fromconda list(channel != pypi, name in the package list) rather than from a hard-coded list.Version drift between channels is real. The conda-forge
molsystemin production was 2026.6.29; PyPI had 2026.9.20.seamm-ff-util2025.8.1 vs 2026.9.20.1.seamm-utilandseamm-widgets2026.7.26/6.28 vs 2026.9.18. This is the “release lag” motivation, measured: two to three months behind on a machine that is updated regularly.
Environment left in place¶
seamm-pip-test is still present for further poking (it is a full
2.4 GB clone). Remove with conda env remove -n seamm-pip-test when
done.