@@ -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,26 +360,26 @@ 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
360366 let mut 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 {
382+ if p . join ( "Lib" ) . exists ( ) {
377383 p. push ( "Lib" ) ;
378384 } else {
379385 p. push ( "lib" ) ;
@@ -471,7 +477,7 @@ impl ParsedPythonDistribution {
471477 /// Ensure pip is available to run in the distribution.
472478 pub fn ensure_pip ( & self , logger : & slog:: Logger ) -> PathBuf {
473479 let dist_prefix = self . base_dir . join ( "python" ) . join ( "install" ) ;
474- let python_paths = resolve_python_paths ( & dist_prefix, & self . version , self . os == "windows" ) ;
480+ let python_paths = resolve_python_paths ( & dist_prefix, & self . version ) ;
475481
476482 let pip_path = python_paths. bin_dir . join ( PIP_EXE_BASENAME ) ;
477483
@@ -480,6 +486,10 @@ impl ParsedPythonDistribution {
480486 invoke_python ( & python_paths, & logger, & [ "-m" , "ensurepip" ] ) ;
481487 }
482488
489+ if VENV_MODULE == "virtualenv" {
490+ invoke_python ( & python_paths, & logger, & [ "-m" , "pip" , "install" , "virtualenv" ] ) ;
491+ }
492+
483493 pip_path
484494 }
485495
@@ -504,7 +514,7 @@ impl ParsedPythonDistribution {
504514 File :: create ( & venv_base. join ( ".timestamp" ) ) . unwrap ( ) ; //.sync_all();
505515 }
506516
507- let python_paths = resolve_python_paths ( & venv_base, & self . version , self . os == "windows" ) ;
517+ let python_paths = resolve_python_paths ( & venv_base, & self . version ) ;
508518
509519 prepare_hacked_distutils ( logger, & python_paths) ;
510520
@@ -519,13 +529,13 @@ impl ParsedPythonDistribution {
519529 let python_paths = self . create_hacked_base ( & logger) ;
520530
521531 if path. exists ( ) {
522- warn ! ( logger, "re-using venv {}" , venv_dir_s) ;
532+ warn ! ( logger, "re-using {} {}" , VENV_MODULE , venv_dir_s) ;
523533 } else {
524- warn ! ( logger, "creating venv {}" , venv_dir_s) ;
525- invoke_python ( & python_paths, & logger, & [ "-m" , "venv" , venv_dir_s. as_str ( ) ] ) ;
534+ warn ! ( logger, "creating {} {}" , VENV_MODULE , venv_dir_s) ;
535+ invoke_python ( & python_paths, & logger, & [ "-m" , VENV_MODULE , venv_dir_s. as_str ( ) ] ) ;
526536 }
527537
528- resolve_python_paths ( & path, & self . version , self . os == "windows" )
538+ resolve_python_paths ( & path, & self . version )
529539 }
530540
531541 /// Create or re-use an existing venv
0 commit comments