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

Crash with fresh_subprocess=True and setuptools #3235

Closed
adamchainz opened this issue Mar 6, 2024 · 1 comment · Fixed by #3237
Closed

Crash with fresh_subprocess=True and setuptools #3235

adamchainz opened this issue Mar 6, 2024 · 1 comment · Fixed by #3237
Assignees
Labels
bug:normal affects many people or has quite an impact help:wanted Issues that have been acknowledged, a solution determined and a PR might likely be accepted.

Comments

@adamchainz
Copy link
Contributor

adamchainz commented Mar 6, 2024

Issue

To try out this new feature from #3233, I added the below to tox.ini in the django-upgrade repo:

[testenv:.pkg]
fresh_subprocess = true

tox 4.14.0 with no plugins then crashes with ValueError: write to closed file.

Environment

Provide at least:

  • OS: macOS
Output of pip list of the host Python, where tox is installed
$ pip list
Package                Version
---------------------- ----------
agate                  1.9.1
agate-dbf              0.2.2
agate-excel            0.4.1
agate-sql              0.7.2
asttokens              2.4.1
asv                    0.6.2
asv_runner             0.2.1
Babel                  2.14.0
black                  24.2.0
Brotli                 1.1.0
build                  1.1.1
CacheControl           0.14.0
cachetools             5.3.2
certifi                2024.2.2
cffi                   1.16.0
cfgv                   3.4.0
chardet                5.2.0
charset-normalizer     3.3.2
cleo                   2.1.0
click                  8.1.7
colorama               0.4.6
crashtest              0.4.1
csvkit                 1.4.0
dbfread                2.0.7
decorator              5.1.1
defusedxml             0.7.1
distlib                0.3.8
docutils               0.20.1
dulwich                0.21.7
et-xmlfile             1.1.0
executing              2.0.1
fastjsonschema         2.19.1
filelock               3.13.1
flake8                 7.0.0
httpie                 3.2.2
identify               2.5.34
idna                   3.6
importlib-metadata     7.0.1
installer              0.7.0
ipdb                   0.13.13
ipython                8.22.1
isodate                0.6.1
jaraco.classes         3.3.1
jedi                   0.17.2
json5                  0.9.17
keyring                24.3.0
leather                0.3.4
markdown-it-py         3.0.0
matplotlib-inline      0.1.6
mccabe                 0.7.0
mdurl                  0.1.2
more-itertools         10.2.0
msgpack                1.0.7
multidict              6.0.5
mutagen                1.47.0
mypy-extensions        1.0.0
nh3                    0.2.15
nodeenv                1.8.0
olefile                0.47
openpyxl               3.1.2
packaging              23.2
parsedatetime          2.6
parso                  0.7.1
pathspec               0.12.1
pexpect                4.9.0
pip                    24.0
pip-tools              7.4.0
pkginfo                1.9.6
platformdirs           4.2.0
pluggy                 1.4.0
poetry                 1.8.2
poetry-core            1.9.0
poetry-plugin-export   1.6.0
pre-commit             3.6.2
prompt-toolkit         3.0.43
ptyprocess             0.7.0
pure-eval              0.2.2
pycodestyle            2.11.1
pycparser              2.21
pycryptodomex          3.20.0
pyflakes               3.2.0
Pygments               2.17.2
Pympler                1.0.1
pyproject-api          1.6.1
pyproject_hooks        1.0.0
PySocks                1.7.1
python-dateutil        2.8.2
python-jsonrpc-server  0.4.0
python-language-server 0.36.2
python-magic           0.4.27
python-slugify         8.0.4
pythonpy               0.4.11
pytimeparse            1.1.8
PyYAML                 6.0.1
rapidfuzz              3.6.1
readme_renderer        43.0
requests               2.31.0
requests-toolbelt      1.0.0
rfc3986                2.0.0
rich                   13.7.0
s3cmd                  2.4.0
setuptools             69.1.0
shellingham            1.5.4
six                    1.16.0
SQLAlchemy             2.0.27
stack-data             0.6.3
tabulate               0.9.0
text-unidecode         1.3
tomli                  2.0.1
tomlkit                0.12.3
tox                    4.14.0
traitlets              5.14.1
trove-classifiers      2024.1.31
twine                  5.0.0
typing_extensions      4.9.0
ujson                  5.9.0
urllib3                2.2.0
uv                     0.1.15
virtualenv             20.25.1
wcwidth                0.2.13
websockets             12.0
wheel                  0.42.0
xattr                  1.1.0
xlrd                   2.0.1
yt-dlp                 2023.12.30
zipp                   3.17.0

Output of running tox

Output of tox -rvv
$ tox -r -e py312
py312: remove tox env folder /Users/chainz/Documents/Projects/_mine/_open/django-upgrade/.tox/py312
.pkg: remove tox env folder /Users/chainz/Documents/Projects/_mine/_open/django-upgrade/.tox/.pkg
py312: install_deps> python -I -m pip install -r requirements/py312.txt
.pkg: install_requires> python -I -m pip install setuptools
.pkg: _optional_hooks> python /Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/pyproject_api/_backend.py True setuptools.build_meta
.pkg: get_requires_for_build_wheel> python /Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/pyproject_api/_backend.py True setuptools.build_meta
py312: internal error
Traceback (most recent call last):
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/session/cmd/run/single.py", line 47, in _evaluate
    tox_env.setup()
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/api.py", line 251, in setup
    self._setup_with_env()
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/runner.py", line 145, in _setup_with_env
    self._setup_pkg()
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/runner.py", line 168, in _setup_pkg
    self._packages = self._build_packages()
                     ^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/python/runner.py", line 120, in _build_packages
    packages = package_env.perform_packaging(self.conf)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/package.py", line 46, in _func
    return meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/python/virtual_env/package/pyproject.py", line 259, in perform_packaging
    self.setup()
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/package.py", line 46, in _func
    return meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/api.py", line 250, in setup
    self._setup_env()
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/package.py", line 46, in _func
    return meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/python/virtual_env/package/pyproject.py", line 191, in _setup_env
    self._setup_build_requires("wheel")
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/package.py", line 46, in _func
    return meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/python/virtual_env/package/pyproject.py", line 199, in _setup_build_requires
    requires = getattr(self._frontend, f"get_requires_for_build_{of_type}")(config_settings=settings).requires
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/cachetools/__init__.py", line 737, in wrapper
    v = func(*args, **kwargs)
        ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/pyproject_api/_frontend.py", line 288, in get_requires_for_build_wheel
    result, out, err = self._send(cmd="get_requires_for_build_wheel", config_settings=config_settings)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/python/virtual_env/package/pyproject.py", line 406, in _send
    return super()._send(cmd, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/pyproject_api/_frontend.py", line 503, in _send
    with self._send_msg(cmd, result_file, msg) as status:
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/contextlib.py", line 137, in __enter__
    return next(self.gen)
           ^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/python/virtual_env/package/pyproject.py", line 432, in _send_msg
    execute_status.write_stdin(f"{msg}{os.linesep}")
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/execute/local_sub_process/__init__.py", line 121, in write_stdin
    stdin.write(bytes_content)
ValueError: write to closed file
  py312: FAIL code 2 (2.81 seconds)
  evaluation failed :( (2.88 seconds)

Minimal example

pyproject.toml:

[build-system]
build-backend = "setuptools.build_meta"
requires = [
  "setuptools",
]

tox.ini:

[testenv]
commands = python -m __hello__

[testenv:.pkg]
fresh_subprocess = true

Crash:

$ tox -r -e py312
py312: remove tox env folder /Users/chainz/tmp/testing/.tox/py312
.pkg: remove tox env folder /Users/chainz/tmp/testing/.tox/.pkg
.pkg: install_requires> python -I -m pip install setuptools
.pkg: _optional_hooks> python /Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/pyproject_api/_backend.py True setuptools.build_meta
.pkg: get_requires_for_build_sdist> python /Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/pyproject_api/_backend.py True setuptools.build_meta
py312: internal error
Traceback (most recent call last):
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/session/cmd/run/single.py", line 47, in _evaluate
    tox_env.setup()
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/api.py", line 251, in setup
    self._setup_with_env()
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/runner.py", line 145, in _setup_with_env
    self._setup_pkg()
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/runner.py", line 168, in _setup_pkg
    self._packages = self._build_packages()
                     ^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/python/runner.py", line 120, in _build_packages
    packages = package_env.perform_packaging(self.conf)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/package.py", line 46, in _func
    return meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/python/virtual_env/package/pyproject.py", line 221, in perform_packaging
    deps = self._load_deps(for_env)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/package.py", line 46, in _func
    return meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/python/virtual_env/package/pyproject.py", line 284, in _load_deps
    deps = self._load_deps_from_built_metadata(for_env)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/package.py", line 46, in _func
    return meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/python/virtual_env/package/pyproject.py", line 328, in _load_deps_from_built_metadata
    reqs = self.get_package_dependencies(for_env)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/package.py", line 46, in _func
    return meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/python/virtual_env/package/pyproject.py", line 336, in get_package_dependencies
    self._ensure_meta_present(for_env)
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/package.py", line 46, in _func
    return meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/python/virtual_env/package/pyproject.py", line 355, in _ensure_meta_present
    self.setup()
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/package.py", line 46, in _func
    return meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/api.py", line 250, in setup
    self._setup_env()
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/package.py", line 46, in _func
    return meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/python/virtual_env/package/pyproject.py", line 189, in _setup_env
    self._setup_build_requires("sdist")
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/package.py", line 46, in _func
    return meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/python/virtual_env/package/pyproject.py", line 199, in _setup_build_requires
    requires = getattr(self._frontend, f"get_requires_for_build_{of_type}")(config_settings=settings).requires
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/cachetools/__init__.py", line 737, in wrapper
    v = func(*args, **kwargs)
        ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/pyproject_api/_frontend.py", line 273, in get_requires_for_build_sdist
    result, out, err = self._send(cmd="get_requires_for_build_sdist", config_settings=config_settings)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/python/virtual_env/package/pyproject.py", line 406, in _send
    return super()._send(cmd, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/pyproject_api/_frontend.py", line 503, in _send
    with self._send_msg(cmd, result_file, msg) as status:
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/contextlib.py", line 137, in __enter__
    return next(self.gen)
           ^^^^^^^^^^^^^^
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/tox_env/python/virtual_env/package/pyproject.py", line 432, in _send_msg
    execute_status.write_stdin(f"{msg}{os.linesep}")
  File "/Users/chainz/.pyenv/versions/3.12.2/lib/python3.12/site-packages/tox/execute/local_sub_process/__init__.py", line 121, in write_stdin
    stdin.write(bytes_content)
ValueError: write to closed file
  py312: FAIL code 2 (1.71 seconds)
  evaluation failed :( (1.74 seconds)
@gaborbernat gaborbernat added bug:normal affects many people or has quite an impact help:wanted Issues that have been acknowledged, a solution determined and a PR might likely be accepted. labels Mar 6, 2024
@gaborbernat gaborbernat self-assigned this Mar 6, 2024
@gaborbernat
Copy link
Member

4.14.1 is out, and enables fresh subprocesses for setuptools build backend by default.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug:normal affects many people or has quite an impact help:wanted Issues that have been acknowledged, a solution determined and a PR might likely be accepted.
Projects
None yet
2 participants