Fixed a bug changed behavior on different OS

This commit is contained in:
Shunsuke Shibayama 2022-08-11 12:47:30 +09:00
parent 9db951d5ac
commit d5720ab6ac

View file

@ -22,43 +22,65 @@ pub fn which_python() -> String {
} }
pub fn detect_magic_number() -> u32 { pub fn detect_magic_number() -> u32 {
let command = if cfg!(windows) { "cmd" } else { "sh" }; let out = if cfg!(windows) {
let arg = if cfg!(windows) { "/C" } else { "-c" }; Command::new("cmd")
.arg("/C")
.arg(which_python())
.arg("-c")
.arg("import importlib.util as util;print(util.MAGIC_NUMBER.hex())")
.output()
.expect("cannot get the magic number from python")
} else {
let python_command = format!("{} -c 'import importlib.util as util;print(util.MAGIC_NUMBER.hex())'", which_python()); let python_command = format!("{} -c 'import importlib.util as util;print(util.MAGIC_NUMBER.hex())'", which_python());
let out = Command::new(command) Command::new("sh")
.arg(arg) .arg("-c")
.arg(python_command) .arg(python_command)
.output() .output()
.expect("cannot get the magic number from python"); .expect("cannot get the magic number from python")
};
let s_hex_magic_num = String::from_utf8(out.stdout).unwrap(); let s_hex_magic_num = String::from_utf8(out.stdout).unwrap();
let first_byte = u8::from_str_radix(&s_hex_magic_num[0..=1], 16).unwrap(); let first_byte = u8::from_str_radix(&s_hex_magic_num[0..=1], 16).unwrap();
let second_byte = u8::from_str_radix(&s_hex_magic_num[2..=3], 16).unwrap(); let second_byte = u8::from_str_radix(&s_hex_magic_num[2..=3], 16).unwrap();
get_magic_num_from_bytes(&[first_byte, second_byte, 0, 0]) get_magic_num_from_bytes(&[first_byte, second_byte, 0, 0])
} }
/// executes over a shell, cause `python` may not exist as an executable file (like pyenv)
pub fn exec_pyc<S: Into<String>>(file: S) { pub fn exec_pyc<S: Into<String>>(file: S) {
// executes over a shell, cause `python` may not exist as an executable file (like pyenv) let mut out = if cfg!(windows) {
let command = if cfg!(windows) { "cmd" } else { "sh" }; Command::new("cmd")
let arg = if cfg!(windows) { "/C" } else { "-c" }; .arg("/C")
.arg(which_python())
.arg(&file.into())
.spawn()
.expect("cannot get the magic number from python")
} else {
let python_command = format!("{} {}", which_python(), file.into()); let python_command = format!("{} {}", which_python(), file.into());
let mut out = Command::new(command) Command::new("sh")
.arg(arg) .arg("-c")
.arg(python_command) .arg(python_command)
.spawn() .spawn()
.expect("python not found"); .expect("cannot get the magic number from python")
};
out.wait().expect("python doesn't work"); out.wait().expect("python doesn't work");
} }
/// evaluates over a shell, cause `python` may not exist as an executable file (like pyenv)
pub fn eval_pyc<S: Into<String>>(file: S) -> String { pub fn eval_pyc<S: Into<String>>(file: S) -> String {
// executes over a shell, cause `python` may not exist as an executable file (like pyenv) let out = if cfg!(windows) {
let command = if cfg!(windows) { "cmd" } else { "sh" }; Command::new("cmd")
let arg = if cfg!(windows) { "/C" } else { "-c" }; .arg("/C")
.arg(which_python())
.arg(&file.into())
.spawn()
.expect("cannot get the magic number from python")
} else {
let python_command = format!("{} {}", which_python(), file.into()); let python_command = format!("{} {}", which_python(), file.into());
let out = Command::new(command) Command::new("sh")
.arg(arg) .arg("-c")
.arg(python_command) .arg(python_command)
.spawn() .spawn()
.expect("python not found"); .expect("cannot get the magic number from python")
};
let out = out.wait_with_output().expect("python doesn't work"); let out = out.wait_with_output().expect("python doesn't work");
String::from_utf8(out.stdout).expect("failed to decode python output") String::from_utf8(out.stdout).expect("failed to decode python output")
} }