Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support installing SCT natively on Windows #3682

Closed
15 of 17 tasks
joshuacwnewton opened this issue Feb 9, 2022 · 6 comments · Fixed by #3719
Closed
15 of 17 tasks

Support installing SCT natively on Windows #3682

joshuacwnewton opened this issue Feb 9, 2022 · 6 comments · Fixed by #3719
Assignees
Labels
installation category: install_sct or pip/setup.py OS: Windows (native)
Milestone

Comments

@joshuacwnewton
Copy link
Member

joshuacwnewton commented Feb 9, 2022

Context

Currently, it is not possible to install SCT natively on Windows. Because of this, some sort of virtualization software (e.g. WSL, Docker, a VM) that mimics a UNIX-based environment is needed to run SCT on Windows.

Setting up this virtualization software is often challenging and confusing for our users. So, there is a pressing need to improve this experience -- for example, by streamlining the documentation (#3610).

This issue, however, is for the more radical approach: ditching WSL/Docker/VMs entirely by installing SCT natively on Windows. It's possible that this would require more work than is feasible, so I'm opening this issue as a place to record an initial investigation.

Remaining work

After the initial investigation from (1, 2, 3, 4), there are a number of outstanding tasks required to ensure Windows compatibility:

@joshuacwnewton joshuacwnewton added the installation category: install_sct or pip/setup.py label Feb 9, 2022
@joshuacwnewton joshuacwnewton added this to the 5.6 milestone Feb 9, 2022
@joshuacwnewton joshuacwnewton self-assigned this Feb 9, 2022
@joshuacwnewton
Copy link
Member Author

joshuacwnewton commented Feb 9, 2022

1. Bare-minimum pip install (no PyPI, binaries, PATH modifications, etc.)

The first thing I wanted to try was simply installing SCT and its dependencies on Windows as-is to see what sort of snags we run into:

  1. Download and install Python 3.7.9 x64 executable via this page
  2. Clone spinalcordtoolbox repo
  3. Setup a virtualenv in the SCT directory by running:
    cd <sct-repo-clone-location>
    python -m venv venv_sct
    cd venv_sct/Scripts
    activate
    # upgrade because default p3.7 pip won't resolve dependency conflicts correctly
    python -m pip install --upgrade pip setuptools wheel
  4. Install SCT's dependencies by running:
    cd ../..
    pip install -r requirements.txt
  5. Install SCT by running:
    pip install -e .
    
  6. Verify installation with
    sct_check_dependencies
    
Log of the above steps
(venv_sct) C:\Users\Joshua\repos\spinalcordtoolbox\venv_sct\Scripts>    python -m pip install --upgrade pip setuptools wheel
Collecting pip
  Using cached pip-22.0.3-py3-none-any.whl (2.1 MB)
Collecting setuptools
  Using cached setuptools-60.8.2-py3-none-any.whl (1.1 MB)
Collecting wheel
  Using cached wheel-0.37.1-py2.py3-none-any.whl (35 kB)
Installing collected packages: pip, setuptools, wheel
  Attempting uninstall: pip
    Found existing installation: pip 20.1.1
    Uninstalling pip-20.1.1:
      Successfully uninstalled pip-20.1.1
  Attempting uninstall: setuptools
    Found existing installation: setuptools 47.1.0
    Uninstalling setuptools-47.1.0:
      Successfully uninstalled setuptools-47.1.0
Successfully installed pip-22.0.3 setuptools-60.8.2 wheel-0.37.1

(venv_sct) C:\Users\Joshua\repos\spinalcordtoolbox\venv_sct\Scripts>    cd ../..

(venv_sct) C:\Users\Joshua\repos\spinalcordtoolbox>    pip install -r requirements.txt
Looking in links: https://download.pytorch.org/whl/cpu/torch_stable.html
Ignoring torch: markers 'sys_platform == "darwin"' don't match your environment
Ignoring torchvision: markers 'sys_platform == "darwin"' don't match your environment
warning: missing-index-doctype

× The package index page being used does not have a proper HTML doctype declaration.
╰─> Problematic URL: https://download.pytorch.org/whl/cpu/torch_stable.html

note: This is an issue with the page at the URL mentioned above.
hint: You might need to reach out to the owner of that package index, to get this fixed. See https://github.com/pypa/pip/issues/10825 for context.
Collecting colored
  Using cached colored-1.4.3.tar.gz (29 kB)
  Preparing metadata (setup.py) ... done
Collecting dipy
  Using cached dipy-1.4.1-cp37-none-win_amd64.whl (7.5 MB)
Collecting h5py~=2.10.0
  Using cached h5py-2.10.0-cp37-cp37m-win_amd64.whl (2.5 MB)
Collecting Keras==2.3.1
  Using cached Keras-2.3.1-py2.py3-none-any.whl (377 kB)
Collecting ivadomed
  Using cached ivadomed-2.9.3-py3-none-any.whl (221 kB)
Collecting matplotlib
  Using cached matplotlib-3.5.1-cp37-cp37m-win_amd64.whl (7.2 MB)
Collecting nibabel
  Using cached nibabel-3.2.2-py3-none-any.whl (3.3 MB)
Collecting numpy
  Using cached numpy-1.21.5-cp37-cp37m-win_amd64.whl (14.0 MB)
Collecting onnxruntime>=1.7.0
  Using cached onnxruntime-1.10.0-cp37-cp37m-win_amd64.whl (5.2 MB)
Collecting pandas
  Using cached pandas-1.3.5-cp37-cp37m-win_amd64.whl (10.0 MB)
Collecting psutil
  Using cached psutil-5.9.0-cp37-cp37m-win_amd64.whl (246 kB)
Collecting pyqt5==5.11.3
  Using cached PyQt5-5.11.3-5.11.2-cp35.cp36.cp37.cp38-none-win_amd64.whl (93.4 MB)
Collecting pytest
  Using cached pytest-7.0.0-py3-none-any.whl (296 kB)
Collecting pytest-cov
  Using cached pytest_cov-3.0.0-py3-none-any.whl (20 kB)
Collecting raven
  Using cached raven-6.10.0-py2.py3-none-any.whl (284 kB)
Collecting requests
  Using cached requests-2.27.1-py2.py3-none-any.whl (63 kB)
Collecting requirements-parser
  Using cached requirements_parser-0.5.0-py3-none-any.whl (18 kB)
Collecting scipy
  Using cached scipy-1.7.3-cp37-cp37m-win_amd64.whl (34.1 MB)
Collecting scikit-image
  Using cached scikit_image-0.19.1-cp37-cp37m-win_amd64.whl (12.4 MB)
Collecting scikit-learn
  Using cached scikit_learn-1.0.2-cp37-cp37m-win_amd64.whl (7.1 MB)
Collecting tensorflow~=1.15.0
  Using cached tensorflow-1.15.5-cp37-cp37m-win_amd64.whl (55.3 MB)
Collecting torch==1.5.0+cpu
  Using cached https://download.pytorch.org/whl/cpu/torch-1.5.0%2Bcpu-cp37-cp37m-win_amd64.whl (109.2 MB)
Collecting torchvision==0.6.0+cpu
  Using cached https://download.pytorch.org/whl/cpu/torchvision-0.6.0%2Bcpu-cp37-cp37m-win_amd64.whl (456 kB)
Collecting xlwt
  Using cached xlwt-1.3.0-py2.py3-none-any.whl (99 kB)
Collecting tqdm
  Using cached tqdm-4.62.3-py2.py3-none-any.whl (76 kB)
Collecting transforms3d
  Using cached transforms3d-0.3.1.tar.gz (62 kB)
  Preparing metadata (setup.py) ... done
Collecting urllib3[secure]
  Using cached urllib3-1.26.8-py2.py3-none-any.whl (138 kB)
Collecting pytest_console_scripts
  Using cached pytest_console_scripts-1.2.2-py3-none-any.whl
Collecting wquantiles
  Using cached wquantiles-0.6-py3-none-any.whl (3.3 kB)
Collecting six>=1.9.0
  Using cached six-1.16.0-py2.py3-none-any.whl (11 kB)
Collecting keras-applications>=1.0.6
  Using cached Keras_Applications-1.0.8-py3-none-any.whl (50 kB)
Collecting keras-preprocessing>=1.0.5
  Using cached Keras_Preprocessing-1.1.2-py2.py3-none-any.whl (42 kB)
Collecting pyyaml
  Using cached PyYAML-6.0-cp37-cp37m-win_amd64.whl (153 kB)
Collecting PyQt5_sip<4.20,>=4.19.11
  Using cached PyQt5_sip-4.19.19-cp37-none-win_amd64.whl (52 kB)
Collecting future
  Using cached future-0.18.2.tar.gz (829 kB)
  Preparing metadata (setup.py) ... done
Collecting pillow>=4.1.1
  Using cached Pillow-9.0.1-cp37-cp37m-win_amd64.whl (3.2 MB)
Collecting torchio>=0.18.68
  Using cached torchio-0.18.73-py2.py3-none-any.whl (164 kB)
Collecting pybids>=0.12.4
  Using cached pybids-0.14.0-py3-none-any.whl (3.2 MB)
Collecting tensorboard>=1.15.0
  Using cached tensorboard-2.8.0-py3-none-any.whl (5.8 MB)
Collecting seaborn~=0.11
  Using cached seaborn-0.11.2-py3-none-any.whl (292 kB)
Collecting joblib~=1.0
  Using cached joblib-1.1.0-py2.py3-none-any.whl (306 kB)
Collecting pyparsing<3,>=2.0.2
  Using cached pyparsing-2.4.7-py2.py3-none-any.whl (67 kB)
Collecting onnxruntime>=1.7.0
  Using cached onnxruntime-1.7.0-cp37-cp37m-win_amd64.whl (4.4 MB)
Collecting csv-diff>=1.0
  Using cached csv_diff-1.1-py3-none-any.whl (12 kB)
Collecting loguru~=0.5
  Using cached loguru-0.6.0-py3-none-any.whl (58 kB)
Collecting protobuf
  Using cached protobuf-3.19.4-cp37-cp37m-win_amd64.whl (896 kB)
Collecting kiwisolver>=1.0.1
  Using cached kiwisolver-1.3.2-cp37-cp37m-win_amd64.whl (51 kB)
Collecting fonttools>=4.22.0
  Using cached fonttools-4.29.1-py3-none-any.whl (895 kB)
Collecting packaging>=20.0
  Using cached packaging-21.3-py3-none-any.whl (40 kB)
Collecting cycler>=0.10
  Using cached cycler-0.11.0-py3-none-any.whl (6.4 kB)
Collecting python-dateutil>=2.7
  Using cached python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
Requirement already satisfied: setuptools in c:\users\joshua\repos\spinalcordtoolbox\venv_sct\lib\site-packages (from nibabel->-r requirements.txt (line 9)) (60.8.2)
Collecting pytz>=2017.3
  Using cached pytz-2021.3-py2.py3-none-any.whl (503 kB)
Collecting pluggy<2.0,>=0.12
  Using cached pluggy-1.0.0-py2.py3-none-any.whl (13 kB)
Collecting tomli>=1.0.0
  Using cached tomli-2.0.1-py3-none-any.whl (12 kB)
Collecting iniconfig
  Using cached iniconfig-1.1.1-py2.py3-none-any.whl (5.0 kB)
Collecting colorama
  Using cached colorama-0.4.4-py2.py3-none-any.whl (16 kB)
Collecting py>=1.8.2
  Using cached py-1.11.0-py2.py3-none-any.whl (98 kB)
Collecting attrs>=19.2.0
  Using cached attrs-21.4.0-py2.py3-none-any.whl (60 kB)
Collecting importlib-metadata>=0.12
  Using cached importlib_metadata-4.10.1-py3-none-any.whl (17 kB)
Collecting atomicwrites>=1.0
  Using cached atomicwrites-1.4.0-py2.py3-none-any.whl (6.8 kB)
Collecting coverage[toml]>=5.2.1
  Using cached coverage-6.3.1-cp37-cp37m-win_amd64.whl (186 kB)
Collecting certifi>=2017.4.17
  Using cached certifi-2021.10.8-py2.py3-none-any.whl (149 kB)
Collecting charset-normalizer~=2.0.0
  Using cached charset_normalizer-2.0.11-py3-none-any.whl (39 kB)
Collecting idna<4,>=2.5
  Using cached idna-3.3-py3-none-any.whl (61 kB)
Collecting types-setuptools>=57.0.0
  Using cached types_setuptools-57.4.9-py3-none-any.whl (27 kB)
Collecting PyWavelets>=1.1.1
  Using cached PyWavelets-1.2.0-cp37-cp37m-win_amd64.whl (4.2 MB)
Collecting imageio>=2.4.1
  Using cached imageio-2.15.0-py3-none-any.whl (3.3 MB)
Collecting tifffile>=2019.7.26
  Using cached tifffile-2021.11.2-py3-none-any.whl (178 kB)
Collecting networkx>=2.2
  Using cached networkx-2.6.3-py3-none-any.whl (1.9 MB)
Collecting threadpoolctl>=2.0.0
  Using cached threadpoolctl-3.1.0-py3-none-any.whl (14 kB)
Collecting google-pasta>=0.1.6
  Using cached google_pasta-0.2.0-py3-none-any.whl (57 kB)
Collecting termcolor>=1.1.0
  Using cached termcolor-1.1.0.tar.gz (3.9 kB)
  Preparing metadata (setup.py) ... done
Requirement already satisfied: wheel>=0.26 in c:\users\joshua\repos\spinalcordtoolbox\venv_sct\lib\site-packages (from tensorflow~=1.15.0->-r requirements.txt (line 25)) (0.37.1)
Collecting tensorflow-estimator==1.15.1
  Using cached tensorflow_estimator-1.15.1-py2.py3-none-any.whl (503 kB)
Collecting grpcio>=1.8.6
  Using cached grpcio-1.43.0-cp37-cp37m-win_amd64.whl (3.3 MB)
Collecting gast==0.2.2
  Using cached gast-0.2.2.tar.gz (10 kB)
  Preparing metadata (setup.py) ... done
Collecting wrapt>=1.11.1
  Using cached wrapt-1.13.3-cp37-cp37m-win_amd64.whl (34 kB)
Collecting absl-py>=0.7.0
  Using cached absl_py-1.0.0-py3-none-any.whl (126 kB)
Collecting opt-einsum>=2.3.2
  Using cached opt_einsum-3.3.0-py3-none-any.whl (65 kB)
Collecting numpy
  Using cached numpy-1.18.5-cp37-cp37m-win_amd64.whl (12.7 MB)
Collecting astor>=0.6.0
  Using cached astor-0.8.1-py2.py3-none-any.whl (27 kB)
Collecting tensorboard>=1.15.0
  Using cached tensorboard-1.15.0-py3-none-any.whl (3.8 MB)
Collecting cryptography>=1.3.4
  Using cached cryptography-36.0.1-cp36-abi3-win_amd64.whl (2.2 MB)
Collecting pyOpenSSL>=0.14
  Using cached pyOpenSSL-22.0.0-py2.py3-none-any.whl (55 kB)
Collecting mock>=2.0.0
  Using cached mock-4.0.3-py3-none-any.whl (28 kB)
Collecting cffi>=1.12
  Using cached cffi-1.15.0-cp37-cp37m-win_amd64.whl (179 kB)
Collecting click
  Using cached click-8.0.3-py3-none-any.whl (97 kB)
Collecting dictdiffer
  Using cached dictdiffer-0.9.0-py2.py3-none-any.whl (16 kB)
Collecting typing-extensions>=3.6.4
  Using cached typing_extensions-4.0.1-py3-none-any.whl (22 kB)
Collecting zipp>=0.5
  Using cached zipp-3.7.0-py3-none-any.whl (5.3 kB)
Collecting win32-setctime>=1.0.0
  Using cached win32_setctime-1.1.0-py3-none-any.whl (3.6 kB)
Collecting bids-validator
  Using cached bids_validator-1.8.9-py2.py3-none-any.whl (20 kB)
Collecting sqlalchemy<1.4.0.dev0
  Using cached SQLAlchemy-1.3.24-cp37-cp37m-win_amd64.whl (1.2 MB)
Collecting formulaic~=0.2.4
  Using cached formulaic-0.2.4-py3-none-any.whl (55 kB)
Collecting num2words
  Using cached num2words-0.5.10-py3-none-any.whl (101 kB)
Collecting werkzeug>=0.11.15
  Using cached Werkzeug-2.0.3-py3-none-any.whl (289 kB)
Collecting markdown>=2.6.8
  Using cached Markdown-3.3.6-py3-none-any.whl (97 kB)
Collecting SimpleITK!=2.0.*
  Using cached SimpleITK-2.1.1-cp37-cp37m-win_amd64.whl (26.2 MB)
Collecting Deprecated
  Using cached Deprecated-1.2.13-py2.py3-none-any.whl (9.6 kB)
Collecting humanize
  Using cached humanize-3.14.0-py3-none-any.whl (98 kB)
Collecting pycparser
  Using cached pycparser-2.21-py2.py3-none-any.whl (118 kB)
Collecting interface-meta>=1.2
  Using cached interface_meta-1.2.4-py2.py3-none-any.whl (14 kB)
Collecting docopt>=0.6.2
  Using cached docopt-0.6.2.tar.gz (25 kB)
  Preparing metadata (setup.py) ... done
Building wheels for collected packages: colored, gast, transforms3d, termcolor, future, docopt
  Building wheel for colored (setup.py) ... done
  Created wheel for colored: filename=colored-1.4.3-py3-none-any.whl size=14342 sha256=1ba886a043458c95b9102075f40273a610a418c37e486a987c4645fcfe7c05ec
  Stored in directory: c:\users\joshua\appdata\local\pip\cache\wheels\4a\f6\00\835e81851bc345428a253721c8bdad0062721dfb861bc6e752
  Building wheel for gast (setup.py) ... done
  Created wheel for gast: filename=gast-0.2.2-py3-none-any.whl size=7554 sha256=a43f20d442c07dc841dc3e5640a33a0a33fd16142556abf42bf90794835dcf18
  Stored in directory: c:\users\joshua\appdata\local\pip\cache\wheels\21\7f\02\420f32a803f7d0967b48dd823da3f558c5166991bfd204eef3
  Building wheel for transforms3d (setup.py) ... done
  Created wheel for transforms3d: filename=transforms3d-0.3.1-py3-none-any.whl size=59385 sha256=ece1aaabe73a44b9b1f2549b5fe84914b5370fd5e1d0d648263ac8573f1ef8a5
  Stored in directory: c:\users\joshua\appdata\local\pip\cache\wheels\b5\b7\93\8985551f83720ce37548a5b543c75380bb707955a9c2c5d28c
  Building wheel for termcolor (setup.py) ... done
  Created wheel for termcolor: filename=termcolor-1.1.0-py3-none-any.whl size=4848 sha256=f29384b12c459940698cf311137fa746fdd75b9c9e2a4a0b2bb768ac4b57e974
  Stored in directory: c:\users\joshua\appdata\local\pip\cache\wheels\3f\e3\ec\8a8336ff196023622fbcb36de0c5a5c218cbb24111d1d4c7f2
  Building wheel for future (setup.py) ... done
  Created wheel for future: filename=future-0.18.2-py3-none-any.whl size=491070 sha256=60fd11850e7794e12229d7f902c95fdc98585e8527e874ac378de00f57860f15
  Stored in directory: c:\users\joshua\appdata\local\pip\cache\wheels\56\b0\fe\4410d17b32f1f0c3cf54cdfb2bc04d7b4b8f4ae377e2229ba0
  Building wheel for docopt (setup.py) ... done
  Created wheel for docopt: filename=docopt-0.6.2-py2.py3-none-any.whl size=13723 sha256=f6923aed3a35b79396d5b79e4fa8338ed26406d53c079e30d4d34d3936f7ea36
  Stored in directory: c:\users\joshua\appdata\local\pip\cache\wheels\72\b0\3f\1d95f96ff986c7dfffe46ce2be4062f38ebd04b506c77c81b9
Successfully built colored gast transforms3d termcolor future docopt
Installing collected packages: xlwt, types-setuptools, transforms3d, termcolor, tensorflow-estimator, SimpleITK, raven, pytz, PyQt5_sip, iniconfig, docopt, dictdiffer, colored, certifi, bids-validator, zipp, wrapt, win32-setctime, werkzeug, urllib3, typing-extensions, tomli, threadpoolctl, sqlalchemy, six, requirements-parser, pyyaml, pyqt5, pyparsing, pycparser, py, psutil, protobuf, pillow, numpy, num2words, networkx, mock, kiwisolver, joblib, interface-meta, idna, gast, future, fonttools, cycler, coverage, colorama, charset-normalizer, attrs, atomicwrites, astor, wquantiles, tqdm, torch, tifffile, scipy, requests, PyWavelets, python-dateutil, packaging, opt-einsum, onnxruntime, loguru, keras-preprocessing, importlib-metadata, imageio, h5py, grpcio, google-pasta, Deprecated, cffi, absl-py, torchvision, scikit-learn, scikit-image, pluggy, pandas, nibabel, matplotlib, markdown, keras-applications, humanize, cryptography, click, torchio, tensorboard, seaborn, pytest, pyOpenSSL, Keras, formulaic, dipy, csv-diff, tensorflow, pytest-cov, pytest_console_scripts, pybids, ivadomed
Successfully installed Deprecated-1.2.13 Keras-2.3.1 PyQt5_sip-4.19.19 PyWavelets-1.2.0 SimpleITK-2.1.1 absl-py-1.0.0 astor-0.8.1 atomicwrites-1.4.0 attrs-21.4.0 bids-validator-1.8.9 certifi-2021.10.8 cffi-1.15.0 charset-normalizer-2.0.11 click-8.0.3 colorama-0.4.4 colored-1.4.3 coverage-6.3.1 cryptography-36.0.1 csv-diff-1.1 cycler-0.11.0 dictdiffer-0.9.0 dipy-1.4.1 docopt-0.6.2 fonttools-4.29.1 formulaic-0.2.4 future-0.18.2 gast-0.2.2 google-pasta-0.2.0 grpcio-1.43.0 h5py-2.10.0 humanize-3.14.0 idna-3.3 imageio-2.15.0 importlib-metadata-4.10.1 iniconfig-1.1.1 interface-meta-1.2.4 ivadomed-2.9.3 joblib-1.1.0 keras-applications-1.0.8 keras-preprocessing-1.1.2 kiwisolver-1.3.2 loguru-0.6.0 markdown-3.3.6 matplotlib-3.5.1 mock-4.0.3 networkx-2.6.3 nibabel-3.2.2 num2words-0.5.10 numpy-1.18.5 onnxruntime-1.7.0 opt-einsum-3.3.0 packaging-21.3 pandas-1.3.5 pillow-9.0.1 pluggy-1.0.0 protobuf-3.19.4 psutil-5.9.0 py-1.11.0 pyOpenSSL-22.0.0 pybids-0.14.0 pycparser-2.21 pyparsing-2.4.7 pyqt5-5.11.3 pytest-7.0.0 pytest-cov-3.0.0 pytest_console_scripts-1.2.2 python-dateutil-2.8.2 pytz-2021.3 pyyaml-6.0 raven-6.10.0 requests-2.27.1 requirements-parser-0.5.0 scikit-image-0.19.1 scikit-learn-1.0.2 scipy-1.7.3 seaborn-0.11.2 six-1.16.0 sqlalchemy-1.3.24 tensorboard-1.15.0 tensorflow-1.15.5 tensorflow-estimator-1.15.1 termcolor-1.1.0 threadpoolctl-3.1.0 tifffile-2021.11.2 tomli-2.0.1 torch-1.5.0+cpu torchio-0.18.73 torchvision-0.6.0+cpu tqdm-4.62.3 transforms3d-0.3.1 types-setuptools-57.4.9 typing-extensions-4.0.1 urllib3-1.26.8 werkzeug-2.0.3 win32-setctime-1.1.0 wquantiles-0.6 wrapt-1.13.3 xlwt-1.3.0 zipp-3.7.0

(venv_sct) C:\Users\Joshua\repos\spinalcordtoolbox>pip install -e .
Obtaining file:///C:/Users/Joshua/repos/spinalcordtoolbox
  Preparing metadata (setup.py) ... done
Installing collected packages: spinalcordtoolbox
  Running setup.py develop for spinalcordtoolbox
Successfully installed spinalcordtoolbox-dev

(venv_sct) C:\Users\Joshua\repos\spinalcordtoolbox>sct_check_dependencies

(venv_sct) C:\Users\Joshua\repos\spinalcordtoolbox>
--
Spinal Cord Toolbox (dev)

sct_check_dependencies
--

SCT info:
- version: dev
- path: c:\users\joshua\repos\spinalcordtoolbox
OS: not identified (Windows-10-10.0.19041-SP0)
CPU cores: Available: 8, Used by ITK functions: 8
RAM: Total: 16232MB, Used: 6877MB, Available: 9355MB
Check Python executable.............................[OK]
  Using bundled python 3.7.9 (tags/v3.7.9:13c94747c7, Aug 17 2020, 18:58:18) [MSC v.1900 64 bit (AMD64)] at c:\users\joshua\repos\spinalcordtoolbox\venv_sct\scripts\python.exe
Check if data are installed.........................[FAIL]
Check if colored is installed.......................[OK] (1.4.3)
Check if dipy is installed..........................[OK] (1.4.1)
Check if h5py is installed..........................[OK] (2.10.0)
Check if Keras (2.3.1) is installed.................[OK] (2.3.1)
Check if ivadomed is installed......................[OK] (2.9.3)
Check if matplotlib is installed....................[OK] (3.5.1)
Check if nibabel is installed.......................[OK] (3.2.2)
Check if numpy is installed.........................[OK] (1.18.5)
Check if onnxruntime is installed...................[OK] (1.7.0)
Check if pandas is installed........................[OK] (1.3.5)
Check if psutil is installed........................[OK] (5.9.0)
Check if pyqt5 (5.11.3) is installed................[OK] (5.11.3)
Check if pytest is installed........................[OK] (7.0.0)
Check if pytest-cov is installed....................[OK] (3.0.0)
Check if raven is installed.........................[OK]
Check if requests is installed......................[OK] (2.27.1)
Check if requirements-parser is installed...........[OK]
Check if scipy is installed.........................[OK] (1.7.3)
Check if scikit-image is installed..................[OK] (0.19.1)
Check if scikit-learn is installed..................[OK] (1.0.2)
Check if tensorflow is installed....................[OK] (1.15.5)
Check if torch (1.5.0+cpu) is installed.............[OK] (1.5.0+cpu)
Check if torchvision (0.6.0+cpu) is installed.......[OK] (0.6.0+cpu)
Check if xlwt is installed..........................[OK] (1.3.0)
Check if tqdm is installed..........................[OK] (4.62.3)
Check if transforms3d is installed..................[OK] (0.3.1)
Check if urllib3 is installed.......................[OK] (1.26.8)
Check if pytest_console_scripts is installed........[OK]
Check if wquantiles is installed....................[OK] (0.4)
Check if spinalcordtoolbox is installed.............[OK]
Check ANTs compatibility with OS ...................[OK]
Check PropSeg compatibility with OS ................[OK]
Check if figure can be opened with matplotlib.......[OK] (Using GUI backend: 'QtAgg')
Check if figure can be opened with PyQt.............[OK]
Check FSLeyes version...............................Exit code 1 occurred. Please report this issue on SCT GitHub: https://github.com/spinalcordtoolbox/spinalcordtoolbox/issues

The whole process went (more or less) without a snag? All of our dependecies have Windows versions, and they all installed OK into a native Windows Python 3.7 venv. The only real issue was with the sct_check_dependencies call, which stalled out, and is likely a platform-specific bug that I'd need to look into.

The next step, I think, will be to try running sct_testing to see what kind of errors pop up. I assume there will be many, given the lack of ANTs binaries!

@joshuacwnewton
Copy link
Member Author

joshuacwnewton commented Feb 9, 2022

2. Running sct_testing as-is

First and foremost, trying to run sct_testing triggers an ImportError due to fcntl being unavailable on Windows. Once I temporarily disabled it for testing purposes using a simple try, except, the testing suite could run.

Next, I manually ran sct_download_data to install the various missing dependencies (as without install_sct, they do not get installed automatically). After that, I re-ran the tests, and here's the short summary:

======================================================================================================= short test summary info =======================================================================================================
FAILED testing/api/test_aggregate_slicewise.py::test_save_as_csv - AssertionError: assert [] == ['dev', 'Fake..., '45.5', ...]
FAILED testing/api/test_aggregate_slicewise.py::test_save_as_csv_extract_metric - AssertionError: assert [] == ['dev', '', '...label_0', ...]
FAILED testing/api/test_centerline.py::test_get_centerline_optic[params0] - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/api/test_centerline.py::test_get_centerline_optic[params1] - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/api/test_centerline.py::test_get_centerline_optic[params2] - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/api/test_image.py::test_add_suffix - AssertionError: assert 'var/lib/usr\\t2sfx.nii.gz' == 'var/lib/usr/t2sfx.nii.gz'
FAILED testing/api/test_image.py::test_splitext - AssertionError: assert ('folder\\image', '.nii.gz') == ('folder/image', '.nii.gz')
FAILED testing/api/test_qc_parallel.py::test_many_qc - PermissionError: [Errno 13] Permission denied: 'C:\\Users\\Joshua\\AppData\\Local\\Temp\\sct-qc-iptt881n\\_json'
FAILED testing/api/test_register.py::test_register_step_ants_slice_regularized_registration - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/api/test_reports.py::test_label_vertebrae - PermissionError: [Errno 13] Permission denied: '/tmp\\_json'
FAILED testing/api/test_reports.py::test_propseg - PermissionError: [Errno 13] Permission denied: '/tmp\\_json'
FAILED testing/api/test_sct_run_batch.py::test_config_with_args_warning - PermissionError: [Errno 13] Permission denied: 'C:\\Users\\Joshua\\AppData\\Local\\Temp\\tmpd8clh7an.json'
FAILED testing/api/test_sct_run_batch.py::test_config_extra_value_warning - PermissionError: [Errno 13] Permission denied: 'C:\\Users\\Joshua\\AppData\\Local\\Temp\\tmprhxdkwdg.yml'
FAILED testing/api/test_sct_run_batch.py::test_only_one_include - PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\Joshua\\AppData\\Local\\Temp\\tmpg__2qbg...
FAILED testing/api/test_sct_run_batch.py::test_non_executable_task - AssertionError: Script already executable
FAILED testing/api/test_sct_run_batch.py::test_no_sessions - PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\Joshua\\AppData\\Local\\Temp\\tmpbybl688j\\lo...
FAILED testing/api/test_sct_run_batch.py::test_separate_sessions - PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\Joshua\\AppData\\Local\\Temp\\tmp5o_zw4...
FAILED testing/api/test_straightening.py::test_straighten - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/api/test_transfo.py::test_transfo_null - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/api/test_transfo.py::test_transfo_figure_out_ants_frame_exhaustive - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/api/test_transfo.py::test_transfo_exhaustive_wrt_orientations - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/api/test_transfo.py::test_transfo_skip_pix2phys - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli.py::test_scripts_with_no_args_as_subprocess[subprocess-isct_convert_binary_to_trilinear] - assert 0 is 2
FAILED testing/cli/test_cli.py::test_scripts_with_no_args_as_subprocess[subprocess-isct_minc2volume-viewer] - assert 0 is 2
FAILED testing/cli/test_cli_sct_analyze_texture.py::test_sct_analyze_texture_image_data_within_threshold - FileExistsError: [WinError 183] Cannot create a file when that file already exists: 't2_contrast_1_45.nii.gz' -> 't2_2reor...
FAILED testing/cli/test_cli_sct_apply_transfo.py::test_sct_apply_transfo_output_image_attributes[template/template/PAM50_small_t2.nii.gz-t2/t2.nii.gz-t2/warp_template2anat.nii.gz-PAM50_small_t2_reg.nii-remaining_args0] - OSError:...
FAILED testing/cli/test_cli_sct_apply_transfo.py::test_sct_apply_transfo_output_image_attributes[template/template/PAM50_small_t2.nii.gz-t2/t2.nii.gz-t2/warp_template2anat.nii.gz-PAM50_small_t2_reg-crop1.nii-remaining_args1] - OS...
FAILED testing/cli/test_cli_sct_apply_transfo.py::test_sct_apply_transfo_output_image_attributes[template/template/PAM50_small_t2.nii.gz-t2/t2.nii.gz-t2/warp_template2anat.nii.gz-PAM50_small_t2_reg-crop2.nii-remaining_args2] - OS...
FAILED testing/cli/test_cli_sct_apply_transfo.py::test_sct_apply_transfo_output_image_attributes[template/template/PAM50_small_t2.nii.gz-t2/t2.nii.gz-t2/warp_template2anat.nii.gz-PAM50_small_t2_reg-concatWarp.nii-remaining_args3]
FAILED testing/cli/test_cli_sct_apply_transfo.py::test_sct_apply_transfo_output_image_attributes[template/template/PAM50_small_t2.nii.gz-dmri/dmri.nii.gz-t2/warp_template2anat.nii.gz-PAM50_small_t2_reg-4Dref.nii-remaining_args4]
FAILED testing/cli/test_cli_sct_apply_transfo.py::test_sct_apply_transfo_output_image_attributes[dmri/dmri.nii.gz-t2/t2.nii.gz-mt/warp_t22mt1.nii.gz-PAM50_small_t2_reg-4Din.nii-remaining_args5] - OSError: [WinError 193] %1 is not...
FAILED testing/cli/test_cli_sct_compute_hausdorff_distance.py::test_sct_compute_hausdorff_distance_null_values - RuntimeError
FAILED testing/cli/test_cli_sct_concat_transfo.py::test_sct_concat_transfo_no_checks - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_create_mask.py::test_sct_create_mask_no_checks[mt/mt1.nii.gz-coord,15x17-10] - OSError: [Errno 22] Invalid argument: 'C:\\Users\\Joshua\\AppData\\Local\\Temp\\sct-20220209144718.515788-create_mask-...
FAILED testing/cli/test_cli_sct_create_mask.py::test_sct_create_mask_no_checks[mt/mt1.nii.gz-point,mt/mt1_point.nii.gz-10] - OSError: [Errno 22] Invalid argument: 'C:\\Users\\Joshua\\AppData\\Local\\Temp\\sct-20220209144718.60871...
FAILED testing/cli/test_cli_sct_create_mask.py::test_sct_create_mask_no_checks[mt/mt1.nii.gz-center-10] - OSError: [Errno 22] Invalid argument: 'C:\\Users\\Joshua\\AppData\\Local\\Temp\\sct-20220209144718.725965-create_mask-s12xt...
FAILED testing/cli/test_cli_sct_create_mask.py::test_sct_create_mask_no_checks[dmri/dmri.nii.gz-center-10] - OSError: [Errno 22] Invalid argument: 'data_RPI.nii'
FAILED testing/cli/test_cli_sct_deepseg_gm.py::test_sct_deepseg_gm_check_dice_coefficient_against_groundtruth - PermissionError: [Errno 13] Permission denied: 'c:\\users\\joshua\\repos\\spinalcordtoolbox\\data\\sct_testing_data\\...
FAILED testing/cli/test_cli_sct_deepseg_lesion.py::test_sct_deepseg_lesion_no_checks - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_deepseg_sc.py::test_sct_deepseg_sc_check_output_exists - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_deepseg_sc.py::test_sct_deepseg_sc_qc_report_exists - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_detect_pmj.py::test_sct_detect_pmj_check_euclidean_distance_against_groundtruth - RuntimeError
FAILED testing/cli/test_cli_sct_dice_coefficient.py::test_sct_dice_coefficient_check_output_against_groundtruth - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_dmri_moco.py::test_sct_dmri_moco_check_params - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_dmri_moco.py::test_sct_dmri_moco_sagittal_no_checks - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_fmri_moco.py::test_sct_fmri_moco_no_checks - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_get_centerline.py::test_sct_get_centerline_no_checks - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_image.py::test_sct_image_display_warp_check_output_exists - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_label_vertebrae.py::test_sct_label_vertebrae_consistent_disc - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_label_vertebrae.py::test_sct_label_vertebrae_initfile_qc_no_checks - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_label_vertebrae.py::test_sct_label_vertebrae_high_value_warning - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_label_vertebrae.py::test_sct_label_vertebrae_clean_labels - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_label_vertebrae.py::test_sct_label_vertebrae_disc_discontinuity_center_of_mass_error - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_propseg.py::test_sct_propseg_check_dice_coefficient_against_groundtruth - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_propseg.py::test_isct_propseg_compatibility - AssertionError: isct_propseg does not seem to be compatible with your system or is no up-to-date... Please contact SCT administrators.
FAILED testing/cli/test_cli_sct_propseg.py::test_sct_propseg_o_flag - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_qc.py::test_sct_qc_no_checks - PermissionError: [Errno 13] Permission denied: './qc\\_json'
FAILED testing/cli/test_cli_sct_register_multimodal.py::test_sct_register_multimodal_mask_files_exist - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_register_multimodal.py::test_sct_register_multimodal_mt0_image_data_within_threshold[False-step=1,algo=syn,type=im,iter=1,smooth=1,shrink=2,metric=MI-mt/mt0_reg_syn_goldstandard.nii.gz] - OSError: ...
FAILED testing/cli/test_cli_sct_register_multimodal.py::test_sct_register_multimodal_mt0_image_data_within_threshold[False-step=1,algo=slicereg,type=im,iter=5,smooth=0,metric=MeanSquares-mt/mt0_reg_slicereg_goldstandard.nii.gz]
FAILED testing/cli/test_cli_sct_register_multimodal.py::test_sct_register_multimodal_mt0_image_data_within_threshold[True-step=1,algo=centermassrot,type=seg,rot_method=pca-None] - OSError: [WinError 193] %1 is not a valid Win32 a...
FAILED testing/cli/test_cli_sct_register_multimodal.py::test_sct_register_multimodal_mt0_image_data_within_threshold[True-step=1,algo=centermassrot,type=imseg,rot_method=hog-None] - OSError: [WinError 193] %1 is not a valid Win32...
FAILED testing/cli/test_cli_sct_register_multimodal.py::test_sct_register_multimodal_mt0_image_data_within_threshold[True-step=1,algo=centermassrot,type=imseg,rot_method=pcahog-None] - OSError: [WinError 193] %1 is not a valid Wi...
FAILED testing/cli/test_cli_sct_register_multimodal.py::test_sct_register_multimodal_mt0_image_data_within_threshold[True-step=1,algo=columnwise,type=seg,smooth=1-None] - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_register_multimodal.py::test_sct_register_multimodal_with_softmask - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_register_to_template.py::test_sct_register_to_template_non_rpi_template - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_register_to_template.py::test_sct_register_to_template_non_rpi_data - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_register_to_template.py::test_sct_register_to_template_dice_coefficient_against_groundtruth[template/template/PAM50_small_cord.nii.gz-remaining_args0] - OSError: [WinError 193] %1 is not a valid Wi...
FAILED testing/cli/test_cli_sct_register_to_template.py::test_sct_register_to_template_dice_coefficient_against_groundtruth[c:\\users\\joshua\\repos\\spinalcordtoolbox\\data/PAM50/template/PAM50_cord.nii.gz-remaining_args1] - OSE...
FAILED testing/cli/test_cli_sct_smooth_spinalcord.py::test_sct_smooth_spinalcord_check_output_files - RuntimeError
FAILED testing/cli/test_cli_sct_straighten_spinalcord.py::test_sct_straighten_spinalcord_no_checks - OSError: [WinError 193] %1 is not a valid Win32 application
FAILED testing/cli/test_cli_sct_warp_template.py::test_sct_warp_template_no_checks - OSError: [WinError 193] %1 is not a valid Win32 application
ERROR testing/cli/test_cli_sct_dmri_moco.py::test_sct_dmri_moco_with_mask_check_params - OSError: [Errno 22] Invalid argument: 'C:\\Users\\Joshua\\AppData\\Local\\Temp\\sct-20220209144818.636103-create_mask-gg3abl69\\line.nii'
=========================================================================== 72 failed, 294 passed, 18 skipped, 26996 warnings, 1 error in 385.55s (0:06:25) ===========================================================================

Alrighty! There are 73 issues (72 failures + 1 error) to unpack here:

  • 49/72: Compiled binary compatibility errors
    • 46/72: OSError: [WinError 193] %1 is not a valid Win32 application
    • 3/72 isct_ binary compatibility errors
  • 7/72: PermissionError: [Errno 13] Permission denied (--> filepath)
  • 5/72: OSError: [Errno 22] Invalid argument
  • 3/72: PermissionError: [WinError 32] The process cannot access the file because it is being used by another process
  • 3/72: RuntimeError
  • 2/72: Line-separator errors (e.g. assert 'var/lib/usr\\t2sfx.nii.gz' == 'var/lib/usr/t2sfx.nii.gz')
  • 2/72: AssertionError: assert [] == ['dev', 'Fake..., '45.5', ...]
  • 1/72: AssertionError: Script already executable
  • 1/72: FileExistsError: [WinError 183] Cannot create a file when that file already exists

So... a cursory look suggests that while the majority of errors are due to not having compiled binaries for Windows, there will be quite a bit of extra work on top of that to pin down pesky Windows-specific filesystem errors.

@joshuacwnewton
Copy link
Member Author

joshuacwnewton commented Feb 11, 2022

3. Compiling binaries (ANTs, isct_) on Windows

Given the test failures in #3682 (comment), the elephant in the room here is compiling our C++ binaries on Windows.

Important links
  • We have a rough outline of how to do this for Linux and macOS on this dev Wiki page, however some of the instructions are a little imprecise, and there aren't currently any Windows instructions.
  • ANTs' current documentation has instructions for compiling ANTs on Windows 10, but they... suggest to use WSL then compile within an Ubuntu environment, which I presume is not what we want given that we want to try to support Windows natively.
  • Thankfully, however, there's an old thread on ANTs' source-forge page that suggests native Windows compilation is possible!
  • Tangentially related: @kousu has spent some time on compiling our binaries via CI workflows in Use binaries that are packaged by the spinalcordtoolbox-binaries repo #2668, which could help to demystify and standardize this procedure even more.
Compiling ANTs
  1. Download and install CMake (specifically, cmake-3.23.0-rc1-windows-x86_64.msi).
  2. Download and install Visual Studio 2015 (to use as a CMake generator)
    • Download the "DVD" (.iso) version of "Visual Studio Community 2015 with Update 3"
    • Mount the .iso file then run the vs_community.exe executable.
    • Unselect everything except the "Visual C++"-related packages
    • Open Visual Studio 2015 to complete the first-time setup, then close it.
  3. Download and compile zlib
    • Download and extract zlib source code
    • Open cmake, and select the zlib source code directory for "Where is the source code"
    • Create a build/ directory inside the zlib source code directory, then select it for "Where to build the binaries"
    • Click "Configure", then select "Visual Studio 14 2015" and "x64"
    • Once that's finished running, click "Generate".
    • Click "Open Project".
    • In one of the top dropdowns, select "Release" instead of "Debug"
    • Click "Build > Build Solution"
  4. Download and compile ANTs
    • Download the Source Code (.zip) for the latest stable release
      • NB: Make sure you download the source code to location with a very short path! Otherwise, you may run into this ITK issue while compiling ANTs. I sure did!
    • Open CMake, and select the ANTs source code directory for "Where is the source code"
    • Create a build/ directory outside of the ANTs source code directory, then select it for "Where to build the binaries"
    • Click "Configure", then select "Visual Studio 14 2015" and "x64"
    • This will fail with an error "Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR)".
    • Click "Add Entry" and add ZLIB_LIBRARY (Example).
    • Click "Advanced" checkbox, then change the existing ZLIB_INCLUDE_DIR to wherever you built zlib. (Example)
    • Find the existing entry for "BUILD_TESTING" with and uncheck the box to turn the bool value to "OFF"
    • Click "Configure" again, then "Generate".
    • Click "Open Project".
    • In one of the top dropdowns, select "Release" instead of "Debug"
    • Click "Build > Build Solution"
    • (Optional) Copy the necessary binaries to the ${SCT_DIR}/bin directory, renaming them to append isct_ and remove .exe accordingly.
Compiling isct_spine_detect and isct_train_svm

The ctrDetect binaries have already been compiled for Windows. :)

Compiling isct_dice_coefficient

These steps assume you've compiled ANTs ahead of time (see above), as the steps here rely on having a compiled copy of ITK to refer to.

  1. Compile isct_dice_coefficient
    • Bugfixes needed prior to compilation:
      • In CMakeLists.txt, change the entire TARGET_LINK_LIBRARIES command to `target_link_libraries(isct_dice_coefficient ${ITK_LIBRARIES})
    • Create a folder build/ inside ${SCT_DIR}/dev/isct_dice_coefficient
    • Open CMake, and target ${SCT_DIR}/dev/isct_dice_coefficient and ${SCT_DIR}/dev/isct_dice_coefficient/build for the source code and build directories respectively.
    • Run Configure, which should fail, because the ITK_DIR variable isn't set.
    • Set the ITK_DIR variable to the directory where ITK was built for the ANTs compilation step (for me, this was C:/Users/Joshua/Documents/ANTs/build/ITKv5-build), then re-run Configure.
    • Click Generate.
    • Click Open Project.
    • Change "Debug" to "Release" in the top dropdown.
    • Click Build Project.
Compiling isct_propseg

However, I'm having some difficulty compiling isct_propseg: I'm running into many C++ errors and warnings, and I believe this would require a bit of cleanup of the isct_propseg code. This isn't a new problem, as @zougloub already had to go through this process once before in #1685.

Given that there have been suggestions to promote sct_deepseg_sc/sct_deepseg over sct_propseg, it's possible that not being able to compile isct_propseg isn't the end of the world; theoretically, SCT would still be very usable on windows without putting in the effort to clean up the C++ code.

That's 7/8 binaries taken care of! It's just isct_propseg that's the problematic one.

@joshuacwnewton
Copy link
Member Author

joshuacwnewton commented Feb 16, 2022

4. Bugfixes for Windows-specific test failures

Since I was able to get a (mostly) complete set of Windows binaries, our test failures have fallen from 73 to ~50. I'm going to continue to try to get that number down even further.

EDIT: I've gotten the test failures from 50 to 9: #3699

For the remaining test failures (see #3699 (comment)), I believe they will require some discussion and further digging. So, I'll make a write-up of the trickier test failures in individual issues, so that we can discuss the remaining work required for this task as a team.

@joshuacwnewton
Copy link
Member Author

joshuacwnewton commented Feb 18, 2022

After the above comments, I've summarized the remaining work to be done in the description of this issue: #3682 (comment)

I'll also continue to update the description as new developments occur in other issues.

@joshuacwnewton
Copy link
Member Author

I'm going to mark this issue as solved by #3719.

The bulk of the work has been completed, and when new issues arise, they get discussed in subsequent issues with the "Windows Compatibility" tag (as has been done for #3740).

So, I think the need for a singular issue documenting the core progress is no longer needed. :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
installation category: install_sct or pip/setup.py OS: Windows (native)
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant