@@ -64,11 +64,10 @@ def create(self, env_dir):
6464 self .system_site_packages = False
6565 self .create_configuration (context )
6666 self .setup_python (context )
67- if not self .upgrade :
68- self .setup_scripts (context )
6967 if self .with_pip :
7068 self ._setup_pip (context )
7169 if not self .upgrade :
70+ self .setup_scripts (context )
7271 self .post_setup (context )
7372 if true_system_site_packages :
7473 # We had set it to False before, now
@@ -159,6 +158,14 @@ def create_configuration(self, context):
159158 f .write ('include-system-site-packages = %s\n ' % incl )
160159 f .write ('version = %d.%d.%d\n ' % sys .version_info [:3 ])
161160
161+ if os .name == 'nt' :
162+ def include_binary (self , f ):
163+ if f .endswith (('.pyd' , '.dll' )):
164+ result = True
165+ else :
166+ result = f .startswith ('python' ) and f .endswith ('.exe' )
167+ return result
168+
162169 def symlink_or_copy (self , src , dst , relative_symlinks_ok = False ):
163170 """
164171 Try symlinking a file, and if that fails, fall back to copying.
@@ -188,9 +195,9 @@ def setup_python(self, context):
188195 binpath = context .bin_path
189196 path = context .env_exe
190197 copier = self .symlink_or_copy
198+ copier (context .executable , path )
191199 dirname = context .python_dir
192200 if os .name != 'nt' :
193- copier (context .executable , path )
194201 if not os .path .islink (path ):
195202 os .chmod (path , 0o755 )
196203 for suffix in ('python' , 'python3' ):
@@ -202,22 +209,26 @@ def setup_python(self, context):
202209 if not os .path .islink (path ):
203210 os .chmod (path , 0o755 )
204211 else :
205- # For normal cases, the venvlauncher will be copied from
206- # our scripts folder. For builds, we need to copy it
207- # manually.
208- if sysconfig .is_python_build (True ):
209- suffix = '.exe'
210- if context .python_exe .lower ().endswith ('_d.exe' ):
211- suffix = '_d.exe'
212-
213- src = os .path .join (dirname , "venvlauncher" + suffix )
214- dst = os .path .join (binpath , context .python_exe )
215- copier (src , dst )
216-
217- src = os .path .join (dirname , "venvwlauncher" + suffix )
218- dst = os .path .join (binpath , "pythonw" + suffix )
219- copier (src , dst )
212+ # See bpo-34011. When using a proper install, we should only need to
213+ # copy the top-level of DLLs.
214+ include = self .include_binary
215+ files = [f for f in os .listdir (dirname ) if include (f )]
216+ for f in files :
217+ src = os .path .join (dirname , f )
218+ dst = os .path .join (binpath , f )
219+ if dst != context .env_exe : # already done, above
220+ copier (src , dst )
220221
222+ # When creating from a build directory, we continue to copy all files.
223+ if sysconfig .is_python_build (True ):
224+ subdir = 'DLLs'
225+ dirname = os .path .join (dirname , subdir )
226+ if os .path .isdir (dirname ):
227+ files = [f for f in os .listdir (dirname ) if include (f )]
228+ for f in files :
229+ src = os .path .join (dirname , f )
230+ dst = os .path .join (binpath , f )
231+ copier (src , dst )
221232 # copy init.tcl over
222233 for root , dirs , files in os .walk (context .python_dir ):
223234 if 'init.tcl' in files :
@@ -315,7 +326,7 @@ def install_scripts(self, context, path):
315326 dstfile = os .path .join (dstdir , f )
316327 with open (srcfile , 'rb' ) as f :
317328 data = f .read ()
318- if not srcfile .endswith (( '.exe' , '.pdb' ) ):
329+ if not srcfile .endswith ('.exe' ):
319330 try :
320331 data = data .decode ('utf-8' )
321332 data = self .replace_variables (data , context )
0 commit comments