@@ -35,6 +35,12 @@ const PIP_EXE_BASENAME: &str = "pip3.exe";
3535#[ cfg( unix) ]
3636const PIP_EXE_BASENAME : & str = "pip3" ;
3737
38+ #[ cfg( windows) ]
39+ const VENV_MODULE : & str = "virtualenv" ;
40+
41+ #[ cfg( unix) ]
42+ const VENV_MODULE : & str = "venv" ;
43+
3844const STDLIB_TEST_PACKAGES : & [ & str ] = & [
3945 "bsddb.test" ,
4046 "ctypes.test" ,
@@ -354,35 +360,34 @@ pub struct PythonPaths {
354360}
355361
356362/// Resolve the location of Python modules given a base install path.
357- pub fn resolve_python_paths ( base : & Path , python_version : & str , is_windows : bool ) -> PythonPaths {
363+ pub fn resolve_python_paths ( base : & Path , python_version : & str ) -> PythonPaths {
358364 let prefix = base. to_path_buf ( ) . canonicalize ( ) . unwrap ( ) ;
359365
360- let mut p = prefix. clone ( ) ;
366+ let p = prefix. clone ( ) ;
361367
362- let bin_dir = if is_windows {
368+ let bin_dir = if p . join ( "Scripts" ) . exists ( ) {
363369 p. join ( "Scripts" )
364370 } else {
365371 p. join ( "bin" )
366372 } ;
367373
368- let python_exe = if is_windows {
369- p. join ( PYTHON_EXE_BASENAME )
370- } else {
374+ let python_exe = if bin_dir. join ( PYTHON_EXE_BASENAME ) . exists ( ) {
371375 bin_dir. join ( PYTHON_EXE_BASENAME )
376+ } else {
377+ p. join ( PYTHON_EXE_BASENAME )
372378 } ;
373379
374380 let pyoxidizer_state_dir = p. join ( "state" ) . join ( "pyoxidizer" ) ;
375381
376- if is_windows {
377- p. push ( "Lib" ) ;
378- } else {
379- p. push ( "lib" ) ;
380- p. push ( format ! ( "python{}" , & python_version[ 0 ..3 ] ) ) ;
381- }
382+ let unix_lib_dir = p. join ( "lib" ) . join ( format ! ( "python{}" , & python_version[ 0 ..3 ] ) ) ;
382383
383- let stdlib = p. clone ( ) . canonicalize ( ) . unwrap ( ) ;
384+ let stdlib = if unix_lib_dir. exists ( ) {
385+ unix_lib_dir
386+ } else {
387+ p. join ( "Lib" )
388+ } . canonicalize ( ) . unwrap ( ) ;
384389
385- let site_packages = p . join ( "site-packages" ) ;
390+ let site_packages = stdlib . join ( "site-packages" ) ;
386391
387392 PythonPaths {
388393 prefix,
@@ -471,7 +476,7 @@ impl ParsedPythonDistribution {
471476 /// Ensure pip is available to run in the distribution.
472477 pub fn ensure_pip ( & self , logger : & slog:: Logger ) -> PathBuf {
473478 let dist_prefix = self . base_dir . join ( "python" ) . join ( "install" ) ;
474- let python_paths = resolve_python_paths ( & dist_prefix, & self . version , self . os == "windows" ) ;
479+ let python_paths = resolve_python_paths ( & dist_prefix, & self . version ) ;
475480
476481 let pip_path = python_paths. bin_dir . join ( PIP_EXE_BASENAME ) ;
477482
@@ -480,6 +485,10 @@ impl ParsedPythonDistribution {
480485 invoke_python ( & python_paths, & logger, & [ "-m" , "ensurepip" ] ) ;
481486 }
482487
488+ if VENV_MODULE == "virtualenv" {
489+ invoke_python ( & python_paths, & logger, & [ "-m" , "pip" , "install" , "virtualenv" ] ) ;
490+ }
491+
483492 pip_path
484493 }
485494
@@ -501,10 +510,10 @@ impl ParsedPythonDistribution {
501510 copy_dir ( & dist_prefix, & venv_base) . unwrap ( ) ;
502511
503512 // Provide a reliable mtime
504- File :: create ( & venv_base. join ( ".timestamp" ) ) . unwrap ( ) ; //.sync_all();
513+ File :: create ( & venv_base. join ( ".timestamp" ) ) . unwrap ( ) ;
505514 }
506515
507- let python_paths = resolve_python_paths ( & venv_base, & self . version , self . os == "windows" ) ;
516+ let python_paths = resolve_python_paths ( & venv_base, & self . version ) ;
508517
509518 prepare_hacked_distutils ( logger, & python_paths) ;
510519
@@ -519,13 +528,13 @@ impl ParsedPythonDistribution {
519528 let python_paths = self . create_hacked_base ( & logger) ;
520529
521530 if path. exists ( ) {
522- warn ! ( logger, "re-using venv {}" , venv_dir_s) ;
531+ warn ! ( logger, "re-using {} {}" , VENV_MODULE , venv_dir_s) ;
523532 } else {
524- warn ! ( logger, "creating venv {}" , venv_dir_s) ;
525- invoke_python ( & python_paths, & logger, & [ "-m" , "venv" , venv_dir_s. as_str ( ) ] ) ;
533+ warn ! ( logger, "creating {} {}" , VENV_MODULE , venv_dir_s) ;
534+ invoke_python ( & python_paths, & logger, & [ "-m" , VENV_MODULE , venv_dir_s. as_str ( ) ] ) ;
526535 }
527536
528- resolve_python_paths ( & path, & self . version , self . os == "windows" )
537+ resolve_python_paths ( & path, & self . version )
529538 }
530539
531540 /// Create or re-use an existing venv
0 commit comments