@@ -64,10 +64,11 @@ 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 )
6769 if self .with_pip :
6870 self ._setup_pip (context )
6971 if not self .upgrade :
70- self .setup_scripts (context )
7172 self .post_setup (context )
7273 if true_system_site_packages :
7374 # We had set it to False before, now
@@ -158,14 +159,6 @@ def create_configuration(self, context):
158159 f .write ('include-system-site-packages = %s\n ' % incl )
159160 f .write ('version = %d.%d.%d\n ' % sys .version_info [:3 ])
160161
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-
169162 def symlink_or_copy (self , src , dst , relative_symlinks_ok = False ):
170163 """
171164 Try symlinking a file, and if that fails, fall back to copying.
@@ -195,9 +188,9 @@ def setup_python(self, context):
195188 binpath = context .bin_path
196189 path = context .env_exe
197190 copier = self .symlink_or_copy
198- copier (context .executable , path )
199191 dirname = context .python_dir
200192 if os .name != 'nt' :
193+ copier (context .executable , path )
201194 if not os .path .islink (path ):
202195 os .chmod (path , 0o755 )
203196 for suffix in ('python' , 'python3' ):
@@ -209,26 +202,22 @@ def setup_python(self, context):
209202 if not os .path .islink (path ):
210203 os .chmod (path , 0o755 )
211204 else :
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 )
221-
222- # When creating from a build directory, we continue to copy all files.
205+ # For normal cases, the venvlauncher will be copied from
206+ # our scripts folder. For builds, we need to copy it
207+ # manually.
223208 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 )
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 )
220+
232221 # copy init.tcl over
233222 for root , dirs , files in os .walk (context .python_dir ):
234223 if 'init.tcl' in files :
@@ -326,7 +315,7 @@ def install_scripts(self, context, path):
326315 dstfile = os .path .join (dstdir , f )
327316 with open (srcfile , 'rb' ) as f :
328317 data = f .read ()
329- if not srcfile .endswith ('.exe' ):
318+ if not srcfile .endswith (( '.exe' , '.pdb' ) ):
330319 try :
331320 data = data .decode ('utf-8' )
332321 data = self .replace_variables (data , context )
0 commit comments