2023-09-17T00:57:29,214 Created temporary directory: /tmp/pip-build-tracker-nl0z3xuh 2023-09-17T00:57:29,215 Initialized build tracking at /tmp/pip-build-tracker-nl0z3xuh 2023-09-17T00:57:29,216 Created build tracker: /tmp/pip-build-tracker-nl0z3xuh 2023-09-17T00:57:29,216 Entered build tracker: /tmp/pip-build-tracker-nl0z3xuh 2023-09-17T00:57:29,217 Created temporary directory: /tmp/pip-wheel-qu7plgzo 2023-09-17T00:57:29,220 Created temporary directory: /tmp/pip-ephem-wheel-cache-cky6hw4g 2023-09-17T00:57:29,242 Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple 2023-09-17T00:57:29,246 2 location(s) to search for versions of mdreg: 2023-09-17T00:57:29,246 * https://pypi.org/simple/mdreg/ 2023-09-17T00:57:29,246 * https://www.piwheels.org/simple/mdreg/ 2023-09-17T00:57:29,247 Fetching project page and analyzing links: https://pypi.org/simple/mdreg/ 2023-09-17T00:57:29,248 Getting page https://pypi.org/simple/mdreg/ 2023-09-17T00:57:29,249 Found index url https://pypi.org/simple/ 2023-09-17T00:57:29,463 Fetched page https://pypi.org/simple/mdreg/ as application/vnd.pypi.simple.v1+json 2023-09-17T00:57:29,467 Skipping link: No binaries permitted for mdreg: https://files.pythonhosted.org/packages/bc/10/c83070f17306c03d644c7c76d8859872032edc1fc0df2a97380d4e93d708/mdreg-0.3.0-py3-none-any.whl (from https://pypi.org/simple/mdreg/) (requires-python:>=3.6, <4) 2023-09-17T00:57:29,468 Found link https://files.pythonhosted.org/packages/78/c8/ba73412c97b1eedd387919d54687fb19b22173a3ba98a9a77136320259eb/mdreg-0.3.0.tar.gz (from https://pypi.org/simple/mdreg/) (requires-python:>=3.6, <4), version: 0.3.0 2023-09-17T00:57:29,469 Skipping link: No binaries permitted for mdreg: https://files.pythonhosted.org/packages/6b/67/cd996be7b682acd1e126cc4e01f6f267fbfff5a7e5fca5c51e065c7b4497/mdreg-0.3.1-py3-none-any.whl (from https://pypi.org/simple/mdreg/) (requires-python:>=3.6, <4) 2023-09-17T00:57:29,471 Found link https://files.pythonhosted.org/packages/eb/8b/0358e3454beda70f4259a4d86932f6e072225039955f5a20d39144173ede/mdreg-0.3.1.tar.gz (from https://pypi.org/simple/mdreg/) (requires-python:>=3.6, <4), version: 0.3.1 2023-09-17T00:57:29,471 Skipping link: No binaries permitted for mdreg: https://files.pythonhosted.org/packages/fc/9b/9783352214c7a6c6b4ca4821d04b43431d151dde90c965ca654c5da8ecc8/mdreg-0.3.2-py3-none-any.whl (from https://pypi.org/simple/mdreg/) (requires-python:>=3.6, <4) 2023-09-17T00:57:29,473 Found link https://files.pythonhosted.org/packages/b3/e6/46b6e3e7ea02fa0e9e2e574282003059b2e1a9eff7a6a8190ee5257219ce/mdreg-0.3.2.tar.gz (from https://pypi.org/simple/mdreg/) (requires-python:>=3.6, <4), version: 0.3.2 2023-09-17T00:57:29,473 Skipping link: No binaries permitted for mdreg: https://files.pythonhosted.org/packages/eb/cc/009dc7b646f1d2d04050ae64541b6824c05389aa7bda945cb15e4e09ee6d/mdreg-0.3.3-py3-none-any.whl (from https://pypi.org/simple/mdreg/) (requires-python:>=3.6, <4) 2023-09-17T00:57:29,474 Found link https://files.pythonhosted.org/packages/18/62/38a61e16f5e992005b50e2b953f90fe3eb11bae5ab211a6960a9d57c77f2/mdreg-0.3.3.tar.gz (from https://pypi.org/simple/mdreg/) (requires-python:>=3.6, <4), version: 0.3.3 2023-09-17T00:57:29,475 Skipping link: No binaries permitted for mdreg: https://files.pythonhosted.org/packages/7d/ce/c978beca9650814b8edcddba5a7ff5573543307070f960c0eb7feec17957/mdreg-0.3.4-py3-none-any.whl (from https://pypi.org/simple/mdreg/) (requires-python:>=3.6) 2023-09-17T00:57:29,476 Found link https://files.pythonhosted.org/packages/53/8e/89bb979b810b86482df67a4ae8393cd66c7b43f73bcdf463d8647de0e74d/mdreg-0.3.4.tar.gz (from https://pypi.org/simple/mdreg/) (requires-python:>=3.6), version: 0.3.4 2023-09-17T00:57:29,476 Skipping link: No binaries permitted for mdreg: https://files.pythonhosted.org/packages/f7/c0/15afa6ef8924d5643277b9fef0b79c5560fea1146a2b2b65e85741b6ee56/mdreg-0.3.5-py3-none-any.whl (from https://pypi.org/simple/mdreg/) (requires-python:>=3.6) 2023-09-17T00:57:29,477 Found link https://files.pythonhosted.org/packages/f8/0c/c82e36fb517a1b0ff55867faac4f244742451a7dfa8ccd1be29a433cb8a9/mdreg-0.3.5.tar.gz (from https://pypi.org/simple/mdreg/) (requires-python:>=3.6), version: 0.3.5 2023-09-17T00:57:29,478 Skipping link: No binaries permitted for mdreg: https://files.pythonhosted.org/packages/54/40/aa8baa682552a94319ea93b241cf2ecf998a1bf0aebe66de4c9399c54999/mdreg-0.3.6-py3-none-any.whl (from https://pypi.org/simple/mdreg/) (requires-python:>=3.6) 2023-09-17T00:57:29,479 Found link https://files.pythonhosted.org/packages/79/85/bdbf14dfd10b079138f5e5f0885f60206318e3468760d23f23c22c4f6b13/mdreg-0.3.6.tar.gz (from https://pypi.org/simple/mdreg/) (requires-python:>=3.6), version: 0.3.6 2023-09-17T00:57:29,480 Skipping link: No binaries permitted for mdreg: https://files.pythonhosted.org/packages/a5/1b/48db59c55e4238cdbd68747bf6365e2864dd195f8c57fb8e8ddb4768e137/mdreg-0.3.7-py3-none-any.whl (from https://pypi.org/simple/mdreg/) (requires-python:>=3.6) 2023-09-17T00:57:29,480 Found link https://files.pythonhosted.org/packages/e6/5b/16528b763bb003eb9d0332ce47dbcf446fd1367790d17757ec5831082303/mdreg-0.3.7.tar.gz (from https://pypi.org/simple/mdreg/) (requires-python:>=3.6), version: 0.3.7 2023-09-17T00:57:29,481 Skipping link: No binaries permitted for mdreg: https://files.pythonhosted.org/packages/b6/bb/c78bb87dfac20455065ec083b5330fdc2012591d4d7522ac88f6a10bdd3e/mdreg-0.3.8-py3-none-any.whl (from https://pypi.org/simple/mdreg/) (requires-python:>=3.6) 2023-09-17T00:57:29,482 Found link https://files.pythonhosted.org/packages/4f/f7/47321f6137507e7ff9532409f40a205430712a4e79b44d5336052a923dc3/mdreg-0.3.8.tar.gz (from https://pypi.org/simple/mdreg/) (requires-python:>=3.6), version: 0.3.8 2023-09-17T00:57:29,483 Fetching project page and analyzing links: https://www.piwheels.org/simple/mdreg/ 2023-09-17T00:57:29,483 Getting page https://www.piwheels.org/simple/mdreg/ 2023-09-17T00:57:29,485 Found index url https://www.piwheels.org/simple/ 2023-09-17T00:57:29,761 Fetched page https://www.piwheels.org/simple/mdreg/ as text/html 2023-09-17T00:57:29,764 Skipping link: No binaries permitted for mdreg: https://www.piwheels.org/simple/mdreg/mdreg-0.3.8-py3-none-any.whl#sha256=26b03dd2f8b3f000a166951fed6805880fe8decffe550f2327ba0f859e106cc6 (from https://www.piwheels.org/simple/mdreg/) (requires-python:>=3.6) 2023-09-17T00:57:29,764 Skipping link: No binaries permitted for mdreg: https://www.piwheels.org/simple/mdreg/mdreg-0.3.7-py3-none-any.whl#sha256=445b61f0185645af57288306a89f23a1c441aedd57726661eef30f4a23484ba3 (from https://www.piwheels.org/simple/mdreg/) (requires-python:>=3.6) 2023-09-17T00:57:29,765 Skipping link: No binaries permitted for mdreg: https://www.piwheels.org/simple/mdreg/mdreg-0.3.6-py3-none-any.whl#sha256=7230f82660b1ffde739a93ab083cc79516d665df5c6adbdc4c5a408cb41407f4 (from https://www.piwheels.org/simple/mdreg/) (requires-python:>=3.6) 2023-09-17T00:57:29,765 Skipping link: No binaries permitted for mdreg: https://www.piwheels.org/simple/mdreg/mdreg-0.3.5-py3-none-any.whl#sha256=bf741071ce63495726a43fcb272985baefdfd15c582b6723803977118d8fc37e (from https://www.piwheels.org/simple/mdreg/) (requires-python:>=3.6) 2023-09-17T00:57:29,766 Skipping link: No binaries permitted for mdreg: https://www.piwheels.org/simple/mdreg/mdreg-0.3.4-py3-none-any.whl#sha256=d360bb8491484762fab111a00dd3ba9152592ee1fe5e1ee940f3f2261ed9db1d (from https://www.piwheels.org/simple/mdreg/) (requires-python:>=3.6) 2023-09-17T00:57:29,766 Skipping link: not a file: https://www.piwheels.org/simple/mdreg/ 2023-09-17T00:57:29,767 Skipping link: not a file: https://pypi.org/simple/mdreg/ 2023-09-17T00:57:29,786 Given no hashes to check 1 links for project 'mdreg': discarding no candidates 2023-09-17T00:57:29,804 Collecting mdreg==0.3.1 2023-09-17T00:57:29,806 Created temporary directory: /tmp/pip-unpack-symvuc7f 2023-09-17T00:57:30,023 Downloading mdreg-0.3.1.tar.gz (21 kB) 2023-09-17T00:57:30,084 Added mdreg==0.3.1 from https://files.pythonhosted.org/packages/eb/8b/0358e3454beda70f4259a4d86932f6e072225039955f5a20d39144173ede/mdreg-0.3.1.tar.gz to build tracker '/tmp/pip-build-tracker-nl0z3xuh' 2023-09-17T00:57:30,086 Running setup.py (path:/tmp/pip-wheel-qu7plgzo/mdreg_52f851ad01984f9089e05ac89816ca25/setup.py) egg_info for package mdreg 2023-09-17T00:57:30,087 Created temporary directory: /tmp/pip-pip-egg-info-m70bo4v_ 2023-09-17T00:57:30,087 Preparing metadata (setup.py): started 2023-09-17T00:57:30,088 Running command python setup.py egg_info 2023-09-17T00:57:30,774 Traceback (most recent call last): 2023-09-17T00:57:30,775 File "", line 2, in 2023-09-17T00:57:30,775 File "", line 34, in 2023-09-17T00:57:30,776 File "/tmp/pip-wheel-qu7plgzo/mdreg_52f851ad01984f9089e05ac89816ca25/setup.py", line 13, in 2023-09-17T00:57:30,777 with open('requirements.txt', encoding='utf-8') as f: 2023-09-17T00:57:30,778 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2023-09-17T00:57:30,779 FileNotFoundError: [Errno 2] No such file or directory: 'requirements.txt' 2023-09-17T00:57:30,780 # Description 2023-09-17T00:57:30,780 Python implementation of model-based image coregistration 2023-09-17T00:57:30,781 for quantitative medical imaging applications. 2023-09-17T00:57:30,783 The distribution comes with a number of common signal models and uses [ITK-Elastix](https://github.com/InsightSoftwareConsortium/ITKElastix) for deformable image registration. 2023-09-17T00:57:30,784 ## Installation 2023-09-17T00:57:30,785 Run `pip install mdreg`. 2023-09-17T00:57:30,786 ## Example data 2023-09-17T00:57:30,787 Example data in [DICOM format](https://shorturl.at/rwCUV) are provided for testing the setup. 2023-09-17T00:57:30,789 ## How to use 2023-09-17T00:57:30,789 Input data must be image arrays in numpy format, with dimensions `(x,y,z,t)` or `(x,y,t)`. 2023-09-17T00:57:30,790 To perform MDR on an image array `im` with default settings do: 2023-09-17T00:57:30,792 ```python 2023-09-17T00:57:30,792 from mdreg import MDReg 2023-09-17T00:57:30,794 mdr = MDReg() 2023-09-17T00:57:30,795 mdr.set_array(im) 2023-09-17T00:57:30,796 mdr.fit() 2023-09-17T00:57:30,796 ``` 2023-09-17T00:57:30,798 When fitting is complete the motion-corrected data are in `mdr.coreg` in the same dimensions 2023-09-17T00:57:30,799 as the original `im`. The calculated deformation fields in format `(x,y,d,t)` or `(x,y,z,d,t)` 2023-09-17T00:57:30,800 can be found as `mdr.deformation`. The dimension `d` holds `x`, `y` components 2023-09-17T00:57:30,800 of the deformation field, and a third `z` component if the input array is 3D. 2023-09-17T00:57:30,802 The default settings will apply a linear signal model and coregistration 2023-09-17T00:57:30,803 as defined in the elastix parameter file `Bsplines.txt`. 2023-09-17T00:57:30,804 # Customization 2023-09-17T00:57:30,806 MDR can be configured to apply different signal models and elastix coregistration settings. 2023-09-17T00:57:30,807 A number of example models and alternative elastix parameter files are included 2023-09-17T00:57:30,808 in the distribution as templates. 2023-09-17T00:57:30,810 The following example fits a mono-exponential decay, uses a mask `im_mask` for co-registration and applies an elastix parameter file `par_file` optimized for a previous DTI-MRI study: 2023-09-17T00:57:30,813 ```python 2023-09-17T00:57:30,814 from mdreg import MDReg 2023-09-17T00:57:30,814 from mdreg.models import exponential_decay 2023-09-17T00:57:30,816 mdr = MDReg() 2023-09-17T00:57:30,816 mdr.set_array(im) 2023-09-17T00:57:30,817 mdr.set_mask(im_mask) 2023-09-17T00:57:30,818 mdr.signal_model = exponential_decay 2023-09-17T00:57:30,819 mdr.read_elastix(par_file) 2023-09-17T00:57:30,820 mdr.fit() 2023-09-17T00:57:30,821 ``` 2023-09-17T00:57:30,822 `im_mask` must be a binary (0s and 1s) or boolean (Trues and Falses) image array in numpy format with the same dimensions as `im`. 2023-09-17T00:57:30,824 The signal model often depends on fixed constants and signal parameters 2023-09-17T00:57:30,825 such as sequence parameters in MRI, or patient-specific constants. These 2023-09-17T00:57:30,826 should all be grouped in a list and set before running the signal model. 2023-09-17T00:57:30,828 Equally elastix parameters can be fine tuned, either by importing a 2023-09-17T00:57:30,829 dedicated elastix file, or by modifying the settings. 2023-09-17T00:57:30,830 You may also choose if you wish to run the process in multiple cores (`parallel`) and to print the co-registration progress to the terminal plus a text file (`log`) or not. 2023-09-17T00:57:30,831 Then, a number of parameters are available to optimize MDR such as 2023-09-17T00:57:30,832 the precision (stopping criterion) and maximum number of iterations. 2023-09-17T00:57:30,834 Some examples: 2023-09-17T00:57:30,835 ```python 2023-09-17T00:57:30,836 from mdreg import MDReg 2023-09-17T00:57:30,836 from mdreg.models import exponential_decay 2023-09-17T00:57:30,838 t = [0.0, 1.25, 2.50, 3.75] # time points for exponential in sec 2023-09-17T00:57:30,839 mdr = MDReg() 2023-09-17T00:57:30,840 mdr.set_array(im) 2023-09-17T00:57:30,840 mdr.signal_parameters = t 2023-09-17T00:57:30,841 mdr.signal_model = exponential_decay 2023-09-17T00:57:30,841 mdr.set_elastix(MaximumNumberOfIterations = 256) # change defaults 2023-09-17T00:57:30,842 mdr.precision = 0.5 # default = 1 2023-09-17T00:57:30,842 mdr.max_iterations = 3 # default = 5 2023-09-17T00:57:30,843 mdr.parallel = False # default = True 2023-09-17T00:57:30,843 mdr.log = True # default = False 2023-09-17T00:57:30,844 mdr.fit() 2023-09-17T00:57:30,844 ``` 2023-09-17T00:57:30,846 `mdreg` comes with a number of options to 2023-09-17T00:57:30,846 export results and diagnostics: 2023-09-17T00:57:30,847 ```python 2023-09-17T00:57:30,848 mdr.export_unregistered = True # export parameters and fit without registration 2023-09-17T00:57:30,849 mdr.export_path = filepath # default is a results folder in the current working directory 2023-09-17T00:57:30,849 mdr.export() # export results after calling fit. 2023-09-17T00:57:30,850 ``` 2023-09-17T00:57:30,851 This export creates movies of original images, motion corrected images, 2023-09-17T00:57:30,852 modelfits, and maps of the fitted parameters. 2023-09-17T00:57:30,853 # Model fitting without motion correction 2023-09-17T00:57:30,855 `MDReg` also can be used to perform model fitting 2023-09-17T00:57:30,855 without correcting the motion. The following script 2023-09-17T00:57:30,856 fits a linearised exponential model to each pixel and exports data 2023-09-17T00:57:30,857 of model and fit: 2023-09-17T00:57:30,858 ```python 2023-09-17T00:57:30,859 from mdreg import MDReg 2023-09-17T00:57:30,859 from mdreg.models import exponential_decay 2023-09-17T00:57:30,860 mdr = MDReg() 2023-09-17T00:57:30,861 mdr.set_array(im) 2023-09-17T00:57:30,862 mdr.signal_model = linear_exponential_decay 2023-09-17T00:57:30,862 mdr.fit_signal() 2023-09-17T00:57:30,863 mdr.export_data() 2023-09-17T00:57:30,864 mdr.export_fit() 2023-09-17T00:57:30,864 ``` 2023-09-17T00:57:30,865 # Defining new MDR models 2023-09-17T00:57:30,866 A model must be defined as a separate module or class with two required functions `main()` and `pars()`. 2023-09-17T00:57:30,867 `pars()` must return a list of strings specifying the names of the model parameters. 2023-09-17T00:57:30,867 `main(im, const)` performs the pixel based model fitting and has two required arguments. 2023-09-17T00:57:30,868 `im` is a numpy ndarray with dimensions `(x,y,z,t)`, `(x,y,t)` or `(x,t)`. `const` is a list 2023-09-17T00:57:30,868 of any constant model parameters. 2023-09-17T00:57:30,869 The function must return the fit to the model as an numpy ndarray with the same dimensions 2023-09-17T00:57:30,870 as `im`, and an ndarray `pars` with dimensions `(x,y,z,p)`, `(x,y,p)` or `(x,p)`. Here `p` enumerates 2023-09-17T00:57:30,870 the model parameters. 2023-09-17T00:57:30,871 ## Context 2023-09-17T00:57:30,873 `mdreg` was first developed for use in quantitative renal MRI in the iBEAt study, 2023-09-17T00:57:30,873 and validated against group-wise model-free registration 2023-09-17T00:57:30,873 (Tagkalakis F, et al. Model-based motion correction outperforms a model-free method in quantitative renal MRI. Abstract-1383, ISMRM 2021). 2023-09-17T00:57:30,874 ## Acknowledgement 2023-09-17T00:57:30,875 The iBEAt study is part of the BEAt-DKD project. The BEAt-DKD project has received funding from the Innovative Medicines Initiative 2 Joint Undertaking under grant agreement No 115974. This Joint Undertaking receives support from the European Union’s Horizon 2020 research and innovation programme and EFPIA with JDRF. For a full list of BEAt-DKD partners, see www.beat-dkd.eu. 2023-09-17T00:57:30,875 ## Authors 2023-09-17T00:57:30,876 Kanishka Sharma, Joao Almeida e Sousa, Steven Sourbron 2023-09-17T00:57:30,877 ERROR: [present-rich] python setup.py egg_info exited with 1 2023-09-17T00:57:30,891 [bold magenta]full command[/]: [blue]/usr/bin/python3 -c ' 2023-09-17T00:57:30,891 exec(compile('"'"''"'"''"'"' 2023-09-17T00:57:30,891 # This is -- a caller that pip uses to run setup.py 2023-09-17T00:57:30,891 # 2023-09-17T00:57:30,891 # - It imports setuptools before invoking setup.py, to enable projects that directly 2023-09-17T00:57:30,891 # import from `distutils.core` to work with newer packaging standards. 2023-09-17T00:57:30,891 # - It provides a clear error message when setuptools is not installed. 2023-09-17T00:57:30,891 # - It sets `sys.argv[0]` to the underlying `setup.py`, when invoking `setup.py` so 2023-09-17T00:57:30,891 # setuptools doesn'"'"'t think the script is `-c`. This avoids the following warning: 2023-09-17T00:57:30,891 # manifest_maker: standard file '"'"'-c'"'"' not found". 2023-09-17T00:57:30,891 # - It generates a shim setup.py, for handling setup.cfg-only projects. 2023-09-17T00:57:30,891 import os, sys, tokenize 2023-09-17T00:57:30,891 2023-09-17T00:57:30,891 try: 2023-09-17T00:57:30,891 import setuptools 2023-09-17T00:57:30,891 except ImportError as error: 2023-09-17T00:57:30,891 print( 2023-09-17T00:57:30,891 "ERROR: Can not execute `setup.py` since setuptools is not available in " 2023-09-17T00:57:30,891 "the build environment.", 2023-09-17T00:57:30,891 file=sys.stderr, 2023-09-17T00:57:30,891 ) 2023-09-17T00:57:30,891 sys.exit(1) 2023-09-17T00:57:30,891 2023-09-17T00:57:30,891 __file__ = %r 2023-09-17T00:57:30,891 sys.argv[0] = __file__ 2023-09-17T00:57:30,891 2023-09-17T00:57:30,891 if os.path.exists(__file__): 2023-09-17T00:57:30,891 filename = __file__ 2023-09-17T00:57:30,891 with tokenize.open(__file__) as f: 2023-09-17T00:57:30,891 setup_py_code = f.read() 2023-09-17T00:57:30,891 else: 2023-09-17T00:57:30,891 filename = "" 2023-09-17T00:57:30,891 setup_py_code = "from setuptools import setup; setup()" 2023-09-17T00:57:30,891 2023-09-17T00:57:30,891 exec(compile(setup_py_code, filename, "exec")) 2023-09-17T00:57:30,891 '"'"''"'"''"'"' % ('"'"'/tmp/pip-wheel-qu7plgzo/mdreg_52f851ad01984f9089e05ac89816ca25/setup.py'"'"',), "", "exec"))' egg_info --egg-base /tmp/pip-pip-egg-info-m70bo4v_[/] 2023-09-17T00:57:30,891 [bold magenta]cwd[/]: /tmp/pip-wheel-qu7plgzo/mdreg_52f851ad01984f9089e05ac89816ca25/ 2023-09-17T00:57:30,892 Preparing metadata (setup.py): finished with status 'error' 2023-09-17T00:57:30,893 ERROR: [present-rich] metadata generation failed 2023-09-17T00:57:30,899 Exception information: 2023-09-17T00:57:30,899 Traceback (most recent call last): 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/operations/build/metadata_legacy.py", line 64, in generate_metadata 2023-09-17T00:57:30,899 call_subprocess( 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/utils/subprocess.py", line 224, in call_subprocess 2023-09-17T00:57:30,899 raise error 2023-09-17T00:57:30,899 pip._internal.exceptions.InstallationSubprocessError: python setup.py egg_info exited with 1 2023-09-17T00:57:30,899 2023-09-17T00:57:30,899 The above exception was the direct cause of the following exception: 2023-09-17T00:57:30,899 2023-09-17T00:57:30,899 Traceback (most recent call last): 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/cli/base_command.py", line 180, in exc_logging_wrapper 2023-09-17T00:57:30,899 status = run_func(*args) 2023-09-17T00:57:30,899 ^^^^^^^^^^^^^^^ 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/cli/req_command.py", line 248, in wrapper 2023-09-17T00:57:30,899 return func(self, options, args) 2023-09-17T00:57:30,899 ^^^^^^^^^^^^^^^^^^^^^^^^^ 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/commands/wheel.py", line 147, in run 2023-09-17T00:57:30,899 requirement_set = resolver.resolve(reqs, check_supported_wheels=True) 2023-09-17T00:57:30,899 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/resolution/resolvelib/resolver.py", line 92, in resolve 2023-09-17T00:57:30,899 result = self._result = resolver.resolve( 2023-09-17T00:57:30,899 ^^^^^^^^^^^^^^^^^ 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_vendor/resolvelib/resolvers.py", line 546, in resolve 2023-09-17T00:57:30,899 state = resolution.resolve(requirements, max_rounds=max_rounds) 2023-09-17T00:57:30,899 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_vendor/resolvelib/resolvers.py", line 397, in resolve 2023-09-17T00:57:30,899 self._add_to_criteria(self.state.criteria, r, parent=None) 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_vendor/resolvelib/resolvers.py", line 173, in _add_to_criteria 2023-09-17T00:57:30,899 if not criterion.candidates: 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_vendor/resolvelib/structs.py", line 156, in __bool__ 2023-09-17T00:57:30,899 return bool(self._sequence) 2023-09-17T00:57:30,899 ^^^^^^^^^^^^^^^^^^^^ 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/resolution/resolvelib/found_candidates.py", line 155, in __bool__ 2023-09-17T00:57:30,899 return any(self) 2023-09-17T00:57:30,899 ^^^^^^^^^ 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/resolution/resolvelib/found_candidates.py", line 143, in 2023-09-17T00:57:30,899 return (c for c in iterator if id(c) not in self._incompatible_ids) 2023-09-17T00:57:30,899 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/resolution/resolvelib/found_candidates.py", line 47, in _iter_built 2023-09-17T00:57:30,899 candidate = func() 2023-09-17T00:57:30,899 ^^^^^^ 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/resolution/resolvelib/factory.py", line 206, in _make_candidate_from_link 2023-09-17T00:57:30,899 self._link_candidate_cache[link] = LinkCandidate( 2023-09-17T00:57:30,899 ^^^^^^^^^^^^^^ 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/resolution/resolvelib/candidates.py", line 293, in __init__ 2023-09-17T00:57:30,899 super().__init__( 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/resolution/resolvelib/candidates.py", line 156, in __init__ 2023-09-17T00:57:30,899 self.dist = self._prepare() 2023-09-17T00:57:30,899 ^^^^^^^^^^^^^^^ 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/resolution/resolvelib/candidates.py", line 225, in _prepare 2023-09-17T00:57:30,899 dist = self._prepare_distribution() 2023-09-17T00:57:30,899 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/resolution/resolvelib/candidates.py", line 304, in _prepare_distribution 2023-09-17T00:57:30,899 return preparer.prepare_linked_requirement(self._ireq, parallel_builds=True) 2023-09-17T00:57:30,899 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/operations/prepare.py", line 538, in prepare_linked_requirement 2023-09-17T00:57:30,899 return self._prepare_linked_requirement(req, parallel_builds) 2023-09-17T00:57:30,899 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/operations/prepare.py", line 653, in _prepare_linked_requirement 2023-09-17T00:57:30,899 dist = _get_prepared_distribution( 2023-09-17T00:57:30,899 ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/operations/prepare.py", line 69, in _get_prepared_distribution 2023-09-17T00:57:30,899 abstract_dist.prepare_distribution_metadata( 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/distributions/sdist.py", line 61, in prepare_distribution_metadata 2023-09-17T00:57:30,899 self.req.prepare_metadata() 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/req/req_install.py", line 568, in prepare_metadata 2023-09-17T00:57:30,899 self.metadata_directory = generate_metadata_legacy( 2023-09-17T00:57:30,899 ^^^^^^^^^^^^^^^^^^^^^^^^^ 2023-09-17T00:57:30,899 File "/usr/local/lib/python3.11/dist-packages/pip/_internal/operations/build/metadata_legacy.py", line 71, in generate_metadata 2023-09-17T00:57:30,899 raise MetadataGenerationFailed(package_details=details) from error 2023-09-17T00:57:30,899 pip._internal.exceptions.MetadataGenerationFailed: metadata generation failed 2023-09-17T00:57:30,913 Removed mdreg==0.3.1 from https://files.pythonhosted.org/packages/eb/8b/0358e3454beda70f4259a4d86932f6e072225039955f5a20d39144173ede/mdreg-0.3.1.tar.gz from build tracker '/tmp/pip-build-tracker-nl0z3xuh' 2023-09-17T00:57:30,914 Removed build tracker: '/tmp/pip-build-tracker-nl0z3xuh'