poetry: Poetry add failing with RuntimeError

  • I am on the latest Poetry version.
  • I have searched the issues of this repo and believe that this is not a duplicate.
  • If an exception occurs when executing a command, I executed it again in debug mode (-vvv option).

Issue

When I try to do ‘poetry add’, a RuntimeError is raised. I’ve encountered this issue with different pip modules. Here is the relevant data:

JKARY-M-V80G:svs-alto jkary$ poetry self update
Updating to 1.1.3
 - Downloading poetry-1.1.3-darwin.tar.gz 100%

Poetry (1.1.3) is installed now. Great!
JKARY-M-V80G:svs-alto jkary$ poetry add ansible
Using version ^2.10.1 for ansible

Updating dependencies
Resolving dependencies... (5.1s)

  RuntimeError

  generator didn't stop after throw()

  at ~/.pyenv/versions/3.7.2/lib/python3.7/contextlib.py:161 in __exit__
      157│                 # by 'except BaseException'.
      158│                 if sys.exc_info()[1] is value:
      159│                     return False
      160│                 raise
    → 161│             raise RuntimeError("generator didn't stop after throw()")
      162│
      163│
      164│ class _AsyncGeneratorContextManager(_GeneratorContextManagerBase,
      165│                                     AbstractAsyncContextManager):
JKARY-M-V80G:svs-alto jkary$ poetry --version
Poetry version 1.1.3
JKARY-M-V80G:svs-alto jkary$ python --version
Python 3.7.2
JKARY-M-V80G:svs-alto jkary$ poetry add -vvv ansible
Using virtualenv: /Users/jkary/src/python/svs-alto/.venv
PyPI: No release information found for ansible-1.9.0, skipping
PyPI: No release information found for ansible-2.0.0, skipping
PyPI: 166 packages found for ansible *
Using version ^2.10.1 for ansible

Updating dependencies
Resolving dependencies...
   1: fact: svs-alto is 0.1.0
   1: derived: svs-alto
   1: fact: svs-alto depends on python-xml2dict (^0.1.1)
   1: fact: svs-alto depends on jupyter (^1.0.0)
   1: fact: svs-alto depends on pandas (^1.1.0)
   1: fact: svs-alto depends on openpyxl (^3.0.4)
   1: fact: svs-alto depends on yaml-1.3 (^0.1.0)
   1: fact: svs-alto depends on pyyaml (^5.3.1)
   1: fact: svs-alto depends on json2yaml (^1.1.1)
   1: fact: svs-alto depends on xlrd (^1.2.0)
   1: fact: svs-alto depends on jinja2 (^2.11.2)
   1: fact: svs-alto depends on virl2_client (2.1.0-rc.1 lib/virl2-client)
   1: fact: svs-alto depends on ucsmsdk (^0.9.10)
   1: fact: svs-alto depends on ansible (^2.10.1)
   1: fact: svs-alto depends on black (^19.10b0)
   1: fact: svs-alto depends on pytest (^6.0.1)
   1: fact: svs-alto depends on black (^19.10b0)
   1: fact: svs-alto depends on pytest (^6.0.1)
   1: selecting svs-alto (0.1.0)
   1: derived: pytest (^6.0.1)
   1: derived: black (^19.10b0)
   1: derived: ansible (^2.10.1)
   1: derived: ucsmsdk (^0.9.10)
   1: derived: virl2_client (2.1.0-rc.1 lib/virl2-client)
   1: derived: jinja2 (^2.11.2)
   1: derived: xlrd (^1.2.0)
   1: derived: json2yaml (^1.1.1)
   1: derived: pyyaml (^5.3.1)
   1: derived: yaml-1.3 (^0.1.0)
   1: derived: openpyxl (^3.0.4)
   1: derived: pandas (^1.1.0)
   1: derived: jupyter (^1.0.0)
   1: derived: python-xml2dict (^0.1.1)
   1: fact: pytest (6.1.1) depends on attrs (>=17.4.0)
   1: fact: pytest (6.1.1) depends on iniconfig (*)
   1: fact: pytest (6.1.1) depends on packaging (*)
   1: fact: pytest (6.1.1) depends on pluggy (>=0.12,<1.0)
   1: fact: pytest (6.1.1) depends on py (>=1.8.2)
   1: fact: pytest (6.1.1) depends on toml (*)
   1: fact: pytest (6.1.1) depends on importlib-metadata (>=0.12)
   1: fact: pytest (6.1.1) depends on atomicwrites (>=1.0)
   1: fact: pytest (6.1.1) depends on colorama (*)
   1: selecting pytest (6.1.1)
   1: derived: colorama (*)
   1: derived: atomicwrites (>=1.0)
   1: derived: importlib-metadata (>=0.12)
   1: derived: toml (*)
   1: derived: py (>=1.8.2)
   1: derived: pluggy (>=0.12,<1.0)
   1: derived: packaging (*)
   1: derived: iniconfig (*)
   1: derived: attrs (>=17.4.0)
   1: fact: black (19.10b0) depends on click (>=6.5)
   1: fact: black (19.10b0) depends on attrs (>=18.1.0)
   1: fact: black (19.10b0) depends on appdirs (*)
   1: fact: black (19.10b0) depends on toml (>=0.9.4)
   1: fact: black (19.10b0) depends on typed-ast (>=1.4.0)
   1: fact: black (19.10b0) depends on regex (*)
   1: fact: black (19.10b0) depends on pathspec (>=0.6,<1)
   1: selecting black (19.10b0)
   1: derived: pathspec (>=0.6,<1)
   1: derived: regex (*)
   1: derived: typed-ast (>=1.4.0)
   1: derived: toml (>=0.9.4)
   1: derived: appdirs (*)
   1: derived: attrs (>=18.1.0)
   1: derived: click (>=6.5)
PyPI: No release information found for ansible-1.9.0, skipping
PyPI: No release information found for ansible-2.0.0, skipping
PyPI: 1 packages found for ansible >=2.10.1,<3.0.0
   1: fact: ansible (2.10.1) depends on ansible-base (>=2.10.2,<2.11)
   1: selecting ansible (2.10.1)
   1: derived: ansible-base (>=2.10.2,<2.11)
PyPI: 1 packages found for ansible-base >=2.10.2,<2.11
   1: fact: ucsmsdk (0.9.10) depends on pyparsing (*)
   1: fact: ucsmsdk (0.9.10) depends on six (*)
   1: selecting ucsmsdk (0.9.10)
   1: derived: six (*)
   1: derived: pyparsing (*)
   1: fact: virl2-client (2.1.0-rc.1 /Users/jkary/src/python/svs-alto/lib/virl2-client) depends on requests (^2)
   1: selecting virl2-client (2.1.0-rc.1 /Users/jkary/src/python/svs-alto/lib/virl2-client)
   1: derived: requests (^2)
   1: fact: jinja2 (2.11.2) depends on MarkupSafe (>=0.23)
   1: selecting jinja2 (2.11.2)
   1: derived: MarkupSafe (>=0.23)
   1: selecting xlrd (1.2.0)
   1: fact: json2yaml (1.1.1) depends on pyyaml (*)
   1: fact: json2yaml (1.1.1) depends on pyaml (*)
   1: fact: json2yaml (1.1.1) depends on docopt (*)
   1: selecting json2yaml (1.1.1)
   1: derived: docopt (*)
   1: derived: pyaml (*)
   1: selecting pyyaml (5.3.1)
   1: fact: yaml-1.3 (0.1.0) depends on ruamel.appconfig (*)
   1: fact: yaml-1.3 (0.1.0) depends on ruamel.std.argparse (>=0.8)
   1: selecting yaml-1.3 (0.1.0)
   1: derived: ruamel.std.argparse (>=0.8)
   1: derived: ruamel.appconfig (*)
   1: fact: openpyxl (3.0.5) depends on jdcal (*)
   1: fact: openpyxl (3.0.5) depends on et-xmlfile (*)
   1: selecting openpyxl (3.0.5)
   1: derived: et-xmlfile (*)
   1: derived: jdcal (*)
   1: fact: pandas (1.1.3) depends on python-dateutil (>=2.7.3)
   1: fact: pandas (1.1.3) depends on pytz (>=2017.2)
   1: fact: pandas (1.1.3) depends on numpy (>=1.15.4)
   1: selecting pandas (1.1.3)
   1: derived: numpy (>=1.15.4)
   1: derived: pytz (>=2017.2)
   1: derived: python-dateutil (>=2.7.3)
   1: fact: jupyter (1.0.0) depends on notebook (*)
   1: fact: jupyter (1.0.0) depends on qtconsole (*)
   1: fact: jupyter (1.0.0) depends on jupyter-console (*)
   1: fact: jupyter (1.0.0) depends on nbconvert (*)
   1: fact: jupyter (1.0.0) depends on ipykernel (*)
   1: fact: jupyter (1.0.0) depends on ipywidgets (*)
   1: selecting jupyter (1.0.0)
   1: derived: ipywidgets (*)
   1: derived: ipykernel (*)
   1: derived: nbconvert (*)
   1: derived: jupyter-console (*)
   1: derived: qtconsole (*)
   1: derived: notebook (*)
   1: selecting python-xml2dict (0.1.1)
   1: selecting colorama (0.4.4)
   1: selecting atomicwrites (1.4.0)
   1: fact: importlib-metadata (2.0.0) depends on zipp (>=0.5)
   1: selecting importlib-metadata (2.0.0)
   1: derived: zipp (>=0.5)
   1: selecting toml (0.10.1)
   1: selecting py (1.9.0)
   1: fact: pluggy (0.13.1) depends on importlib-metadata (>=0.12)
   1: selecting pluggy (0.13.1)
   1: fact: packaging (20.4) depends on pyparsing (>=2.0.2)
   1: fact: packaging (20.4) depends on six (*)
   1: selecting packaging (20.4)
   1: derived: pyparsing (>=2.0.2)
   1: selecting iniconfig (1.1.1)
   1: selecting attrs (20.2.0)
   1: selecting pathspec (0.8.0)
   1: selecting regex (2020.10.15)
   1: selecting typed-ast (1.4.1)
   1: selecting appdirs (1.4.4)
   1: selecting click (7.1.2)
PyPI: Getting info for ansible-base (2.10.2) from PyPI
PyPI: No dependencies found, downloading archives
PyPI: Downloading sdist: ansible-base-2.10.2.tar.gz
   1: Version solving took 5.247 seconds.
   1: Tried 1 solutions.

  Stack trace:

  26  ~/.poetry/lib/poetry/_vendor/py3.7/clikit/console_application.py:131 in run
       129│             parsed_args = resolved_command.args
       130│
     → 131│             status_code = command.handle(parsed_args, io)
       132│         except KeyboardInterrupt:
       133│             status_code = 1

  25  ~/.poetry/lib/poetry/_vendor/py3.7/clikit/api/command/command.py:120 in handle
       118│     def handle(self, args, io):  # type: (Args, IO) -> int
       119│         try:
     → 120│             status_code = self._do_handle(args, io)
       121│         except KeyboardInterrupt:
       122│             if io.is_debug():

  24  ~/.poetry/lib/poetry/_vendor/py3.7/clikit/api/command/command.py:171 in _do_handle
       169│         handler_method = self._config.handler_method
       170│
     → 171│         return getattr(handler, handler_method)(args, io, self)
       172│
       173│     def __repr__(self):  # type: () -> str

  23  ~/.poetry/lib/poetry/_vendor/py3.7/cleo/commands/command.py:92 in wrap_handle
        90│         self._command = command
        91│
     →  92│         return self.handle()
        93│
        94│     def handle(self):  # type: () -> Optional[int]

  22  ~/.poetry/lib/poetry/console/commands/add.py:174 in handle
       172│
       173│         try:
     → 174│             status = self._installer.run()
       175│         except Exception:
       176│             self.poetry.file.write(original_content)

  21  ~/.poetry/lib/poetry/installation/installer.py:103 in run
       101│         local_repo = Repository()
       102│
     → 103│         return self._do_install(local_repo)
       104│
       105│     def dry_run(self, dry_run=True):  # type: (bool) -> Installer

  20  ~/.poetry/lib/poetry/installation/installer.py:235 in _do_install
       233│             )
       234│
     → 235│             ops = solver.solve(use_latest=self._whitelist)
       236│         else:
       237│             self._io.write_line("Installing dependencies from lock file")

  19  ~/.poetry/lib/poetry/puzzle/solver.py:65 in solve
        63│         with self._provider.progress():
        64│             start = time.time()
     →  65│             packages, depths = self._solve(use_latest=use_latest)
        66│             end = time.time()
        67│

  18  ~/.poetry/lib/poetry/puzzle/solver.py:234 in _solve
       232│         try:
       233│             result = resolve_version(
     → 234│                 self._package, self._provider, locked=locked, use_latest=use_latest
       235│             )
       236│

  17  ~/.poetry/lib/poetry/mixology/__init__.py:7 in resolve_version
       5│     solver = VersionSolver(root, provider, locked=locked, use_latest=use_latest)
       6│
     → 7│     return solver.solve()
       8│

  16  ~/.poetry/lib/poetry/mixology/version_solver.py:84 in solve
        82│             while next is not None:
        83│                 self._propagate(next)
     →  84│                 next = self._choose_package_version()
        85│
        86│             return self._result()

  15  ~/.poetry/lib/poetry/mixology/version_solver.py:397 in _choose_package_version
       395│             version = locked
       396│
     → 397│         version = self._provider.complete_package(version)
       398│
       399│         conflict = False

  14  ~/.poetry/lib/poetry/puzzle/provider.py:436 in complete_package
       434│                     package.version.text,
       435│                     extras=list(package.dependency.extras),
     → 436│                     repository=package.dependency.source_name,
       437│                 ),
       438│             )

  13  ~/.poetry/lib/poetry/repositories/pool.py:135 in package
       133│             for idx, repo in enumerate(self._repositories):
       134│                 try:
     → 135│                     package = repo.package(name, version, extras=extras)
       136│                 except PackageNotFound:
       137│                     continue

  12  ~/.poetry/lib/poetry/repositories/pypi_repository.py:162 in package
       160│         extras=None,  # type: (Union[list, None])
       161│     ):  # type: (...) -> Package
     → 162│         return self.get_release_info(name, version).to_package(name=name, extras=extras)
       163│
       164│     def search(self, query):

  11  ~/.poetry/lib/poetry/repositories/pypi_repository.py:228 in get_release_info
       226│
       227│         cached = self._cache.remember_forever(
     → 228│             "{}:{}".format(name, version), lambda: self._get_release_info(name, version)
       229│         )
       230│

  10  ~/.poetry/lib/poetry/_vendor/py3.7/cachy/repository.py:174 in remember_forever
       172│             return val
       173│
     → 174│         val = value(callback)
       175│
       176│         self.forever(key, val)

   9  ~/.poetry/lib/poetry/_vendor/py3.7/cachy/helpers.py:6 in value
       4│ def value(val):
       5│     if callable(val):
     → 6│         return val()
       7│
       8│     return val

   8  ~/.poetry/lib/poetry/repositories/pypi_repository.py:228 in <lambda>
       226│
       227│         cached = self._cache.remember_forever(
     → 228│             "{}:{}".format(name, version), lambda: self._get_release_info(name, version)
       229│         )
       230│

   7  ~/.poetry/lib/poetry/repositories/pypi_repository.py:308 in _get_release_info
       306│                 return data.asdict()
       307│
     → 308│             info = self._get_info_from_urls(urls)
       309│
       310│             data.requires_dist = info.requires_dist

   6  ~/.poetry/lib/poetry/repositories/pypi_repository.py:423 in _get_info_from_urls
       421│                 return self._get_info_from_wheel(platform_specific_wheels[0])
       422│
     → 423│         return self._get_info_from_sdist(urls["sdist"][0])
       424│
       425│     def _get_info_from_wheel(self, url):  # type: (str) -> PackageInfo

   5  ~/.poetry/lib/poetry/repositories/pypi_repository.py:451 in _get_info_from_sdist
       449│             self._download(url, str(filepath))
       450│
     → 451│             return PackageInfo.from_sdist(filepath)
       452│
       453│     def _download(self, url, dest):  # type: (str, str) -> None

   4  ~/.poetry/lib/poetry/inspection/info.py:561 in from_sdist
       559│         """
       560│         if path.is_file():
     → 561│             return cls._from_sdist_file(path=path)
       562│
       563│         # if we get here then it is neither an sdist instance nor a file

   3  ~/.poetry/lib/poetry/inspection/info.py:291 in _from_sdist_file
       289│
       290│             # now this is an unpacked directory we know how to deal with
     → 291│             new_info = cls.from_directory(path=sdist_dir)
       292│
       293│         if not info:

   2  ~/.poetry/lib/poetry/inspection/info.py:541 in from_directory
       539│                         info = cls.from_setup_files(path)
       540│                     else:
     → 541│                         info = cls._pep517_metadata(path)
       542│                 except PackageInfoError:
       543│                     if not info:

   1  ~/.poetry/lib/poetry/inspection/info.py:506 in _pep517_metadata
       504│                     )
       505│                 finally:
     → 506│                     os.chdir(cwd.as_posix())
       507│
       508│         if info:

  RuntimeError

  generator didn't stop after throw()

  at ~/.pyenv/versions/3.7.2/lib/python3.7/contextlib.py:161 in __exit__
      157│                 # by 'except BaseException'.
      158│                 if sys.exc_info()[1] is value:
      159│                     return False
      160│                 raise
    → 161│             raise RuntimeError("generator didn't stop after throw()")
      162│
      163│
      164│ class _AsyncGeneratorContextManager(_GeneratorContextManagerBase,
      165│                                     AbstractAsyncContextManager):
JKARY-M-V80G:svs-alto jkary$

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Reactions: 8
  • Comments: 19 (3 by maintainers)

Most upvoted comments

nothing helps me, getting this error again and again

Updating dependencies
Resolving dependencies... (10.2s)

  RuntimeError

  generator didn't stop after throw()

  at /usr/lib/python3.8/contextlib.py:162 in __exit__
      158│                 # by 'except BaseException'.
      159│                 if sys.exc_info()[1] is value:
      160│                     return False
      161│                 raise
    → 162│             raise RuntimeError("generator didn't stop after throw()")
      163│ 
      164│ 
      165│ class _AsyncGeneratorContextManager(_GeneratorContextManagerBase,
      166│                                     AbstractAsyncContextManager):

somewhy even when venv was activated global command was pointed to local version of poetry, non installd to venv virtual. I removed global poetry first and then double checked with ‘which poetry’ command that it uses the exactly version in current venv then everething started working as expected.

p.s. yes, as told above, python -m poetry install should do the trick localy in venv

Same issue here, with poetry 1.1.4 installed via get-poetry.py script

% poetry add ruamel.yaml
Using version ^0.16.12 for ruamel.yaml                                    

Updating dependencies
Resolving dependencies... (0.8s)

  RuntimeError

  generator didn't stop after throw()

  at /usr/lib/python3.7/contextlib.py:161 in __exit__
      157│                 # by 'except BaseException'.
      158│                 if sys.exc_info()[1] is value:
      159│                     return False
      160│                 raise
    → 161│             raise RuntimeError("generator didn't stop after throw()")
      162│ 
      163│ 
      164│ class _AsyncGeneratorContextManager(_GeneratorContextManagerBase,
      165│                                     AbstractAsyncContextManager):

Update: in the same environment, for example poetry add boto3 works fine.