Skip to content

Commit 810d36a

Browse files
committed
Windows: Use virtualenv
1 parent 182c31f commit 810d36a

4 files changed

Lines changed: 34 additions & 24 deletions

File tree

ci/azure-pipelines-template.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ jobs:
6262
- ${{ if eq(parameters.name, 'Windows') }}:
6363
- script: |
6464
set RUST_BACKTRACE=1
65+
set VIRTUALENV_VERBOSE=1
6566
cargo run --bin pyoxidizer -- init --pip-install cryptography --python-code 'print("hello, world")' %HOME%/pyapp
6667
cargo run --bin pyoxidizer -- --verbose run %HOME%/pyapp
6768
displayName: Build Oxidized Application (Windows)

pyoxidizer/src/app_packaging/packaging_rule.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ fn resolve_virtualenv(
431431
let location = ResourceLocation::new(&rule.install_location);
432432

433433
let python_paths =
434-
resolve_python_paths(&Path::new(&rule.path), &dist.version, dist.os == "windows");
434+
resolve_python_paths(&Path::new(&rule.path), &dist.version);
435435

436436
process_resources(
437437
&logger,

pyoxidizer/src/py_packaging/distribution.rs

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ const PIP_EXE_BASENAME: &str = "pip3.exe";
3535
#[cfg(unix)]
3636
const 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+
3844
const 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

pyoxidizer/src/py_packaging/distutils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@ lazy_static! {
3131
"distutils/unixccompiler.py",
3232
include_bytes!("../cpython_lib_hacks/distutils/unixccompiler.py"),
3333
);
34-
res.insert(
34+
/*res.insert(
3535
"venv/__init__.py",
3636
include_bytes!("../cpython_lib_hacks/venv/__init__.py"),
3737
);
3838
res.insert(
3939
"venv/__main__.py",
4040
include_bytes!("../cpython_lib_hacks/venv/__main__.py"),
41-
);
41+
);*/
4242

4343
res
4444
};

0 commit comments

Comments
 (0)