@@ -547,58 +547,67 @@ def test_zippath_from_non_installed_posix(self):
547547rmtree (self .env_dir )
548548# First try to create a non-installed python. It's not a real full
549549# functional non-installed python, but enough for this test.
550+ platlibdir = sys .platlibdir
550551non_installed_dir = os .path .realpath (tempfile .mkdtemp ())
551- try :
552- bindir = os .path .join (non_installed_dir ,self .bindir )
553- os .mkdir (bindir )
554- shutil .copy2 (sys .executable ,bindir )
555- libdir = os .path .join (non_installed_dir ,* self .lib )
556- os .makedirs (libdir )
557- landmark = os .path .join (libdir ,"os.py" )
558- stdlib_zip = "python%d%d.zip" % sys .version_info [:2 ]
559- zip_landmark = os .path .join (non_installed_dir ,
560- self .lib [0 ],
561- stdlib_zip )
562- additional_pythonpath_for_non_installed = []
563- # Copy stdlib files to the non-installed python so venv can
564- # correctly calculate the prefix.
565- for eachpath in sys .path :
566- if eachpath .endswith (".zip" ):
567- if os .path .isfile (eachpath ):
568- shutil .copyfile (
569- eachpath ,
570- os .path .join (non_installed_dir ,self .lib [0 ]))
571- elif os .path .isfile (os .path .join (eachpath ,"os.py" )):
572- for name in os .listdir (eachpath ):
573- if name == "site-packages" :
574- continue
575- fn = os .path .join (eachpath ,name )
576- if os .path .isfile (fn ):
577- shutil .copy (fn ,libdir )
578- elif os .path .isdir (fn ):
579- shutil .copytree (fn ,os .path .join (libdir ,name ))
580- else :
581- additional_pythonpath_for_non_installed .append (
582- eachpath )
583- cmd = [os .path .join (non_installed_dir ,self .bindir ,self .exe ),
584- "-m" ,
585- "venv" ,
586- "--without-pip" ,
587- self .env_dir ]
588- # Our fake non-installed python is not fully functional because
589- # it cannot find the extensions. Set PYTHONPATH so it can run the
590- # venv module correctly.
591- pythonpath = os .pathsep .join (
592- additional_pythonpath_for_non_installed )
593- subprocess .check_call (cmd ,env = {"PYTHONPATH" :pythonpath })
594- envpy = os .path .join (self .env_dir ,self .bindir ,self .exe )
595- # Now check the venv created from the non-installed python has
596- # correct zip path in pythonpath.
597- cmd = [envpy ,'-S' ,'-c' ,'import sys; print(sys.path)' ]
598- out ,err = check_output (cmd )
599- self .assertTrue (zip_landmark .encode ()in out )
600- finally :
601- rmtree (non_installed_dir )
552+ self .addCleanup (rmtree ,non_installed_dir )
553+ bindir = os .path .join (non_installed_dir ,self .bindir )
554+ os .mkdir (bindir )
555+ shutil .copy2 (sys .executable ,bindir )
556+ libdir = os .path .join (non_installed_dir ,platlibdir ,self .lib [1 ])
557+ os .makedirs (libdir )
558+ landmark = os .path .join (libdir ,"os.py" )
559+ stdlib_zip = "python%d%d.zip" % sys .version_info [:2 ]
560+ zip_landmark = os .path .join (non_installed_dir ,
561+ platlibdir ,
562+ stdlib_zip )
563+ additional_pythonpath_for_non_installed = []
564+ # Copy stdlib files to the non-installed python so venv can
565+ # correctly calculate the prefix.
566+ for eachpath in sys .path :
567+ if eachpath .endswith (".zip" ):
568+ if os .path .isfile (eachpath ):
569+ shutil .copyfile (
570+ eachpath ,
571+ os .path .join (non_installed_dir ,platlibdir ))
572+ elif os .path .isfile (os .path .join (eachpath ,"os.py" )):
573+ for name in os .listdir (eachpath ):
574+ if name == "site-packages" :
575+ continue
576+ fn = os .path .join (eachpath ,name )
577+ if os .path .isfile (fn ):
578+ shutil .copy (fn ,libdir )
579+ elif os .path .isdir (fn ):
580+ shutil .copytree (fn ,os .path .join (libdir ,name ))
581+ else :
582+ additional_pythonpath_for_non_installed .append (
583+ eachpath )
584+ cmd = [os .path .join (non_installed_dir ,self .bindir ,self .exe ),
585+ "-m" ,
586+ "venv" ,
587+ "--without-pip" ,
588+ self .env_dir ]
589+ # Our fake non-installed python is not fully functional because
590+ # it cannot find the extensions. Set PYTHONPATH so it can run the
591+ # venv module correctly.
592+ pythonpath = os .pathsep .join (
593+ additional_pythonpath_for_non_installed )
594+ # For python built with shared enabled. We need to set
595+ # LD_LIBRARY_PATH so the non-installed python can find and link
596+ # libpython.so
597+ ld_library_path = os .path .abspath (os .path .dirname (sys .executable ))
598+ if sys .platform == 'darwin' :
599+ ld_library_path_env = "DYLD_LIBRARY_PATH"
600+ else :
601+ ld_library_path_env = "LD_LIBRARY_PATH"
602+ subprocess .check_call (cmd ,
603+ env = {"PYTHONPATH" :pythonpath ,
604+ ld_library_path_env :ld_library_path })
605+ envpy = os .path .join (self .env_dir ,self .bindir ,self .exe )
606+ # Now check the venv created from the non-installed python has
607+ # correct zip path in pythonpath.
608+ cmd = [envpy ,'-S' ,'-c' ,'import sys; print(sys.path)' ]
609+ out ,err = check_output (cmd )
610+ self .assertTrue (zip_landmark .encode ()in out )
602611
603612@requireVenvCreate
604613class EnsurePipTest (BaseTest ):