reubano / csv2ofx

A Python library and command line tool for converting csv to ofx and qif files
MIT License
199 stars 113 forks source link

Unable to install with modern build tools #111

Open jaraco opened 9 months ago

jaraco commented 9 months ago

I'm trying to install csv2ofx on Python 3.12, but it fails when PyYAML<6 fails to build:

 ~ @ pip-run -v git+https://github.com/reubano/csv2ofx
Collecting git+https://github.com/reubano/csv2ofx
  Cloning https://github.com/reubano/csv2ofx to /private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-req-build-doqauwa9
  Running command git clone --filter=blob:none --quiet https://github.com/reubano/csv2ofx /private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-req-build-doqauwa9
  Resolved https://github.com/reubano/csv2ofx to commit 445b76e273b1363b27eb0c174e78821b8d6f2444
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Installing backend dependencies ... done
  Preparing metadata (pyproject.toml) ... done
Collecting meza<0.47.0,>=0.46.0 (from csv2ofx==0.30.0)
  Using cached meza-0.46.0-py2.py3-none-any.whl (56 kB)
Collecting python-dateutil<3.0.0,>=2.7.2 (from csv2ofx==0.30.0)
  Using cached python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
Collecting requests<3.0.0,>=2.18.4 (from csv2ofx==0.30.0)
  Using cached requests-2.31.0-py3-none-any.whl.metadata (4.6 kB)
Collecting chardet<4.0.0,>=3.0.4 (from meza<0.47.0,>=0.46.0->csv2ofx==0.30.0)
  Using cached chardet-3.0.4-py2.py3-none-any.whl (133 kB)
Collecting python-slugify<2.0.0,>=1.2.5 (from meza<0.47.0,>=0.46.0->csv2ofx==0.30.0)
  Using cached python-slugify-1.2.6.tar.gz (6.8 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting xlrd<2.0.0,>=1.1.0 (from meza<0.47.0,>=0.46.0->csv2ofx==0.30.0)
  Using cached xlrd-1.2.0-py2.py3-none-any.whl (103 kB)
Collecting dbfread==2.0.4 (from meza<0.47.0,>=0.46.0->csv2ofx==0.30.0)
  Using cached dbfread-2.0.4-py2.py3-none-any.whl (19 kB)
Collecting ijson<3.0.0,>=2.3 (from meza<0.47.0,>=0.46.0->csv2ofx==0.30.0)
  Using cached ijson-2.6.1.tar.gz (29 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting beautifulsoup4<5.0.0,>=4.6.0 (from meza<0.47.0,>=0.46.0->csv2ofx==0.30.0)
  Using cached beautifulsoup4-4.12.3-py3-none-any.whl.metadata (3.8 kB)
Collecting PyYAML<6.0.0,>=4.2b1 (from meza<0.47.0,>=0.46.0->csv2ofx==0.30.0)
  Using cached PyYAML-5.4.1.tar.gz (175 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... error
  error: subprocess-exited-with-error

  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─> [54 lines of output]
      running egg_info
      writing lib3/PyYAML.egg-info/PKG-INFO
      writing dependency_links to lib3/PyYAML.egg-info/dependency_links.txt
      writing top-level names to lib3/PyYAML.egg-info/top_level.txt
      Traceback (most recent call last):
        File "/opt/homebrew/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 353, in <module>
          main()
        File "/opt/homebrew/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 335, in main
          json_out['return_val'] = hook(**hook_input['kwargs'])
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/opt/homebrew/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 118, in get_requires_for_build_wheel
          return hook(config_settings)
                 ^^^^^^^^^^^^^^^^^^^^^
        File "/private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-build-env-idreswjh/overlay/lib/python3.12/site-packages/setuptools/build_meta.py", line 325, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=['wheel'])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-build-env-idreswjh/overlay/lib/python3.12/site-packages/setuptools/build_meta.py", line 295, in _get_build_requires
          self.run_setup()
        File "/private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-build-env-idreswjh/overlay/lib/python3.12/site-packages/setuptools/build_meta.py", line 311, in run_setup
          exec(code, locals())
        File "<string>", line 271, in <module>
        File "/private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-build-env-idreswjh/overlay/lib/python3.12/site-packages/setuptools/__init__.py", line 103, in setup
          return distutils.core.setup(**attrs)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-build-env-idreswjh/overlay/lib/python3.12/site-packages/setuptools/_distutils/core.py", line 185, in setup
          return run_commands(dist)
                 ^^^^^^^^^^^^^^^^^^
        File "/private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-build-env-idreswjh/overlay/lib/python3.12/site-packages/setuptools/_distutils/core.py", line 201, in run_commands
          dist.run_commands()
        File "/private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-build-env-idreswjh/overlay/lib/python3.12/site-packages/setuptools/_distutils/dist.py", line 969, in run_commands
          self.run_command(cmd)
        File "/private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-build-env-idreswjh/overlay/lib/python3.12/site-packages/setuptools/dist.py", line 963, in run_command
          super().run_command(command)
        File "/private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-build-env-idreswjh/overlay/lib/python3.12/site-packages/setuptools/_distutils/dist.py", line 988, in run_command
          cmd_obj.run()
        File "/private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-build-env-idreswjh/overlay/lib/python3.12/site-packages/setuptools/command/egg_info.py", line 321, in run
          self.find_sources()
        File "/private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-build-env-idreswjh/overlay/lib/python3.12/site-packages/setuptools/command/egg_info.py", line 329, in find_sources
          mm.run()
        File "/private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-build-env-idreswjh/overlay/lib/python3.12/site-packages/setuptools/command/egg_info.py", line 551, in run
          self.add_defaults()
        File "/private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-build-env-idreswjh/overlay/lib/python3.12/site-packages/setuptools/command/egg_info.py", line 589, in add_defaults
          sdist.add_defaults(self)
        File "/private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-build-env-idreswjh/overlay/lib/python3.12/site-packages/setuptools/command/sdist.py", line 112, in add_defaults
          super().add_defaults()
        File "/private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-build-env-idreswjh/overlay/lib/python3.12/site-packages/setuptools/_distutils/command/sdist.py", line 251, in add_defaults
          self._add_defaults_ext()
        File "/private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-build-env-idreswjh/overlay/lib/python3.12/site-packages/setuptools/_distutils/command/sdist.py", line 336, in _add_defaults_ext
          self.filelist.extend(build_ext.get_source_files())
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "<string>", line 201, in get_source_files
        File "/private/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-build-env-idreswjh/overlay/lib/python3.12/site-packages/setuptools/_distutils/cmd.py", line 107, in __getattr__
          raise AttributeError(attr)
      AttributeError: cython_sources
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error

× Getting requirements to build wheel did not run successfully.
│ exit code: 1
╰─> See above for output.

note: This error originates from a subprocess, and is likely not a problem with pip.
Traceback (most recent call last):
  File "/opt/homebrew/bin/pip-run", line 8, in <module>
    sys.exit(run())
             ^^^^^
  File "/opt/homebrew/lib/python3.12/site-packages/pip_run/__init__.py", line 13, in run
    with deps.load(*deps.not_installed(pip_args)) as home:
  File "/opt/homebrew/Cellar/python@3.12/3.12.1_1/Frameworks/Python.framework/Versions/3.12/lib/python3.12/contextlib.py", line 137, in __enter__
    return next(self.gen)
           ^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.12/site-packages/pip_run/deps.py", line 100, in load
    subprocess.check_call(cmd, env=env)
  File "/opt/homebrew/Cellar/python@3.12/3.12.1_1/Frameworks/Python.framework/Versions/3.12/lib/python3.12/subprocess.py", line 413, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '('/opt/homebrew/opt/python@3.12/bin/python3.12', '-m', 'pip', 'install', '-t', PosixPath('/var/folders/k6/291pf0kd0fj91pb9yb45gbj40000gn/T/pip-run-ojr36_va'), '-v', 'git+https://github.com/reubano/csv2ofx')' returned non-zero exit status 1.

Same problem happens on Python 3.8-3.11.

jaraco commented 9 months ago

The underlying cause seems to be: https://github.com/yaml/pyyaml/issues/601

PyYAML 6 does install from source, however, so probably the best course for csv2ofx is not to pin to old PyYAML.

jaraco commented 9 months ago

The PyYAML<6 dependency comes from meza<0.47. The latest version of meza also relies on PyYAML<6 :(

reubano commented 9 months ago

@jaraco you are a meza contributor now so I'd be happy if you were able to fix the underlying issue as well. Thanks!

jaraco commented 3 months ago

This issue is currently blocked due to a lack of release of meza (https://github.com/reubano/meza/pull/63).