Skip to content

Commit 814309a

Browse files
committed
Windows: Use virtualenv
1 parent 182c31f commit 814309a

4 files changed

Lines changed: 26 additions & 15 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: 22 additions & 12 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,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

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)