Skip to content

Commit f4e325c

Browse files
authored
bpo-41011: venv -- add more variables to pyvenv.cfg (GH-30382)
1 parent 46c7a65 commit f4e325c

File tree

3 files changed

+64
-1
lines changed

3 files changed

+64
-1
lines changed

Lib/test/test_venv.py

+37-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from test.support.os_helper import (can_symlink, EnvironmentVarGuard, rmtree)
2020
import unittest
2121
import venv
22-
from unittest.mock import patch
22+
from unittest.mock import patch, Mock
2323

2424
try:
2525
import ctypes
@@ -114,13 +114,49 @@ def test_defaults(self):
114114
executable = sys._base_executable
115115
path = os.path.dirname(executable)
116116
self.assertIn('home = %s' % path, data)
117+
self.assertIn('executable = %s' %
118+
os.path.realpath(sys.executable), data)
119+
copies = '' if os.name=='nt' else ' --copies'
120+
cmd = f'command = {sys.executable} -m venv{copies} --without-pip {self.env_dir}'
121+
self.assertIn(cmd, data)
117122
fn = self.get_env_file(self.bindir, self.exe)
118123
if not os.path.exists(fn): # diagnostics for Windows buildbot failures
119124
bd = self.get_env_file(self.bindir)
120125
print('Contents of %r:' % bd)
121126
print(' %r' % os.listdir(bd))
122127
self.assertTrue(os.path.exists(fn), 'File %r should exist.' % fn)
123128

129+
def test_config_file_command_key(self):
130+
attrs = [
131+
(None, None),
132+
('symlinks', '--copies'),
133+
('with_pip', '--without-pip'),
134+
('system_site_packages', '--system-site-packages'),
135+
('clear', '--clear'),
136+
('upgrade', '--upgrade'),
137+
('upgrade_deps', '--upgrade-deps'),
138+
('prompt', '--prompt'),
139+
]
140+
for attr, opt in attrs:
141+
rmtree(self.env_dir)
142+
if not attr:
143+
b = venv.EnvBuilder()
144+
else:
145+
b = venv.EnvBuilder(
146+
**{attr: False if attr in ('with_pip', 'symlinks') else True})
147+
b.upgrade_dependencies = Mock() # avoid pip command to upgrade deps
148+
b._setup_pip = Mock() # avoid pip setup
149+
self.run_with_capture(b.create, self.env_dir)
150+
data = self.get_text_file_contents('pyvenv.cfg')
151+
if not attr:
152+
for opt in ('--system-site-packages', '--clear', '--upgrade',
153+
'--upgrade-deps', '--prompt'):
154+
self.assertNotRegex(data, rf'command = .* {opt}')
155+
elif os.name=='nt' and attr=='symlinks':
156+
pass
157+
else:
158+
self.assertRegex(data, rf'command = .* {opt}')
159+
124160
def test_prompt(self):
125161
env_name = os.path.split(self.env_dir)[1]
126162

Lib/venv/__init__.py

+24
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ def __init__(self, system_site_packages=False, clear=False,
5151
self.symlinks = symlinks
5252
self.upgrade = upgrade
5353
self.with_pip = with_pip
54+
self.orig_prompt = prompt
5455
if prompt == '.': # see bpo-38901
5556
prompt = os.path.basename(os.getcwd())
5657
self.prompt = prompt
@@ -178,6 +179,29 @@ def create_configuration(self, context):
178179
f.write('version = %d.%d.%d\n' % sys.version_info[:3])
179180
if self.prompt is not None:
180181
f.write(f'prompt = {self.prompt!r}\n')
182+
f.write('executable = %s\n' % os.path.realpath(sys.executable))
183+
args = []
184+
nt = os.name == 'nt'
185+
if nt and self.symlinks:
186+
args.append('--symlinks')
187+
if not nt and not self.symlinks:
188+
args.append('--copies')
189+
if not self.with_pip:
190+
args.append('--without-pip')
191+
if self.system_site_packages:
192+
args.append('--system-site-packages')
193+
if self.clear:
194+
args.append('--clear')
195+
if self.upgrade:
196+
args.append('--upgrade')
197+
if self.upgrade_deps:
198+
args.append('--upgrade-deps')
199+
if self.orig_prompt is not None:
200+
args.append(f'--prompt="{self.orig_prompt}"')
201+
202+
args.append(context.env_dir)
203+
args = ' '.join(args)
204+
f.write(f'command = {sys.executable} -m venv {args}\n')
181205

182206
if os.name != 'nt':
183207
def symlink_or_copy(self, src, dst, relative_symlinks_ok=False):
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Added two new variables to *pyvenv.cfg* which is generated by :mod:`venv`
2+
module: *executable* for the executable and *command* for the command line used
3+
to create the environment.

0 commit comments

Comments
 (0)