This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: venv module does not copy the correct python exe
Type: Stage:
Components: Library (Lib), Windows Versions: Python 3.11, Python 3.10, Python 3.9
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: Ian Norton, eryksun, miss-islington, mitchhentges, n_rosenstein, paul.moore, steve.dower, tim.golden, vinay.sajip, zach.ware
Priority: normal Keywords: patch

Created on 2021-04-06 13:27 by Ian Norton, last changed 2022-04-11 14:59 by admin.

Pull Requests
URL Status Linked Edit
PR 25216 merged Ian Norton, 2021-04-06 14:02
PR 30033 merged miss-islington, 2021-12-10 17:26
PR 30034 merged miss-islington, 2021-12-10 17:26
Messages (13)
msg390329 - (view) Author: Ian Norton (Ian Norton) * Date: 2021-04-06 13:27
On windows, the venv module does not copy the correct python exe if the current running exe (eg sys.executable) has been renamed (eg, named python3.exe)

venv will only make copies of python.exe, pythonw.exe, python_d.exe or pythonw_d.exe.

If for example the python executable has been renamed from python.exe to python3.exe (eg, to co-exist in a system where multiple pythons are on PATH) then this can fail with errors like:

Error: [WinError 2] The system cannot find the file specified

When venv tries to run pip in the new environment.

If the running python executable is a differently named copy then errors like the one described in https://bugs.python.org/issue40588 are seen.
msg390330 - (view) Author: Ian Norton (Ian Norton) * Date: 2021-04-06 13:30
This may also cause https://bugs.python.org/issue35644
msg396286 - (view) Author: Niklas Rosenstein (n_rosenstein) * Date: 2021-06-21 19:56
I just encountered the same behavior. Steps to reproduce:

* Install Python 3 (I used 3.9.5) on Windows
* Use the Admin console to create a python3.exe link, e.g.

    cd "c:/Users/niklas/AppData/Local/Programs/Python/Python39"
    mklink python3.exe python.exe

* Use python3.exe to create a venv, e.g.

    python3 -m venv

The environment is created up until the point _setup_pip() is called in venv, which causes the following error to be printed:

    Error: [WinError 2] The system cannot find the file specified

Running venv from the interpreter gives the full stack trace.

    $ python3 -c 'import venv; venv.main([".venv"])'
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\niklas\AppData\Local\Programs\Python\Python39\lib\venv\__init__.py", line 491, in main
        builder.create(d)
      File "C:\Users\niklas\AppData\Local\Programs\Python\Python39\lib\venv\__init__.py", line 75, in create
        self._setup_pip(context)
      File "C:\Users\niklas\AppData\Local\Programs\Python\Python39\lib\venv\__init__.py", line 299, in _setup_pip
        subprocess.check_output(cmd, stderr=subprocess.STDOUT)
      File "C:\Users\niklas\AppData\Local\Programs\Python\Python39\lib\subprocess.py", line 424, in check_output
        return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
      File "C:\Users\niklas\AppData\Local\Programs\Python\Python39\lib\subprocess.py", line 505, in run
        with Popen(*popenargs, **kwargs) as process:
      File "C:\Users\niklas\AppData\Local\Programs\Python\Python39\lib\subprocess.py", line 951, in __init__
        self._execute_child(args, executable, preexec_fn, close_fds,
      File "C:\Users\niklas\AppData\Local\Programs\Python\Python39\lib\subprocess.py", line 1420, in _execute_child
        hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
    FileNotFoundError: [WinError 2] The system cannot find the file specified
msg396287 - (view) Author: Niklas Rosenstein (n_rosenstein) * Date: 2021-06-21 19:58
To complete my previous comment, patching the function to see the command that is invoked, you can see it tries to invoke 'python3.exe' (seemingly derived from sys.executable) in the venv but the venv only contains 'python.exe'.

['C:\\Users\\niklas\\dotfiles\\.venv\\Scripts\\python3.exe', '-Im', 'ensurepip', '--upgrade', '--default-pip']
msg408224 - (view) Author: Mitchell Hentges (mitchhentges) * Date: 2021-12-10 17:04
Hey, can I request a backport of this change? For my use case, 3.9+ would be great, but going back to 3.7 should be viable? I trust your judgement :)

I'll happily create the PRs for the backport, but it looks like the bug has to be indicated as "needs backport to X.Y" by Python maintainers first (https://devguide.python.org/gitbootcamp/?highlight=backport#backporting-merged-changes)
msg408228 - (view) Author: Vinay Sajip (vinay.sajip) * (Python committer) Date: 2021-12-10 17:27
3.10 and 3.9 - OK, but 3. is security fixes only, I'm afraid.
msg408229 - (view) Author: Vinay Sajip (vinay.sajip) * (Python committer) Date: 2021-12-10 17:27
*3.8, I meant.
msg408231 - (view) Author: Mitchell Hentges (mitchhentges) * Date: 2021-12-10 17:31
That's great, thanks!
msg408233 - (view) Author: Vinay Sajip (vinay.sajip) * (Python committer) Date: 2021-12-10 17:51
New changeset bb8d645f3a09645686cf8f66bd46dcfa4efac713 by Miss Islington (bot) in branch '3.10':
[3.10] bpo-43749: Ensure current exe is copied when using venv on windows (GH-25216) (GH-30034)
https://github.com/python/cpython/commit/bb8d645f3a09645686cf8f66bd46dcfa4efac713
msg408234 - (view) Author: Vinay Sajip (vinay.sajip) * (Python committer) Date: 2021-12-10 18:06
New changeset bad16f0cf71a6b11ef62f86be6b3d3567cd70a16 by Miss Islington (bot) in branch '3.9':
[3.9] bpo-43749: Ensure current exe is copied when using venv on windows (GH-25216) (GH-30033)
https://github.com/python/cpython/commit/bad16f0cf71a6b11ef62f86be6b3d3567cd70a16
msg408247 - (view) Author: Eryk Sun (eryksun) * (Python triager) Date: 2021-12-10 21:21
The Windows implementation of symlink_or_copy() actually copies "python.exe" and "pythonw.exe" launchers from "Lib/venv/scripts/nt". One cannot simply copy the "python3.exe" executable because the required DLLs aren't copied. If this seemed to work when testing, it was only because the installation directory was in PATH. The solution that actually works is to copy the launcher as "python3.exe".
msg408279 - (view) Author: Steve Dower (steve.dower) * (Python committer) Date: 2021-12-11 00:12
We'd also need to update the launcher to launch the executable with its name, which it currently doesn't do. I was looking at this recently for some other reason.
msg408289 - (view) Author: Eryk Sun (eryksun) * (Python triager) Date: 2021-12-11 03:21
The code to copy a file could be rewritten to use a regex match. For example:

            # Copy src to dst. If src is a base executable, copy a launcher.
            dirname, filename = os.path.split(src)
            m = re.match(r'(pythonw?)[0-9._]*((?:_d)?(?:\.exe|\.pdb))$',
                    filename.lower())
            if m is not None:
                src = os.path.join(os.path.dirname(__file__),
                        'scripts', 'nt', m.group(1) + m.group(2))
                # If the base environment is a Python source build, use
                # the launcher in the build directory instead of
                # "Lib/venv/scripts/nt".
                if sysconfig.is_python_build(True) or not os.path.isfile(src):
                    basename = ('venvlauncher' if m.group(1) == 'python' else
                                'venvwlauncher')
                    src = os.path.join(dirname, basename + m.group(2))
History
Date User Action Args
2022-04-11 14:59:43adminsetgithub: 87915
2021-12-11 03:21:25eryksunsetmessages: + msg408289
2021-12-11 00:12:26steve.dowersetmessages: + msg408279
2021-12-10 21:36:06eryksunsetnosy: + paul.moore, tim.golden, zach.ware, steve.dower

components: + Windows
versions: + Python 3.11, - Python 3.8
2021-12-10 21:21:59eryksunsetstatus: closed -> open

nosy: + eryksun
messages: + msg408247

resolution: fixed ->
stage: resolved ->
2021-12-10 18:06:14vinay.sajipsetmessages: + msg408234
2021-12-10 17:51:50vinay.sajipsetmessages: + msg408233
2021-12-10 17:31:17mitchhentgessetmessages: + msg408231
2021-12-10 17:27:35vinay.sajipsetmessages: + msg408229
2021-12-10 17:27:21vinay.sajipsetmessages: + msg408228
2021-12-10 17:26:27miss-islingtonsetpull_requests: + pull_request28259
2021-12-10 17:26:23miss-islingtonsetnosy: + miss-islington

pull_requests: + pull_request28258
2021-12-10 17:04:32mitchhentgessetnosy: + mitchhentges
messages: + msg408224
2021-08-01 06:34:14vinay.sajipsetstatus: open -> closed
resolution: fixed
stage: patch review -> resolved
2021-06-21 19:58:48n_rosensteinsetmessages: + msg396287
2021-06-21 19:56:39n_rosensteinsetnosy: + n_rosenstein
messages: + msg396286
2021-04-09 18:27:24ned.deilysetnosy: + vinay.sajip
2021-04-06 14:02:50Ian Nortonsetkeywords: + patch
stage: patch review
pull_requests: + pull_request23954
2021-04-06 13:30:31Ian Nortonsetmessages: + msg390330
2021-04-06 13:27:05Ian Nortoncreate