Create settings by examining command line arguments and environment variables.
()
| 206 | /// Create settings by examining command line arguments and environment |
| 207 | /// variables. |
| 208 | pub fn parse_opts() -> Result<(Settings, RunMode), lexopt::Error> { |
| 209 | let (args, mode, argv) = parse_args()?; |
| 210 | |
| 211 | let mut settings = Settings::default(); |
| 212 | settings.isolated = args.isolate; |
| 213 | settings.ignore_environment = settings.isolated || args.ignore_environment; |
| 214 | settings.bytes_warning = args.bytes_warning.into(); |
| 215 | settings.import_site = !args.no_site; |
| 216 | |
| 217 | let ignore_environment = settings.ignore_environment; |
| 218 | |
| 219 | if !ignore_environment { |
| 220 | settings.path_list.extend(get_paths("RUSTPYTHONPATH")); |
| 221 | settings.path_list.extend(get_paths("PYTHONPATH")); |
| 222 | } |
| 223 | |
| 224 | // Now process command line flags: |
| 225 | |
| 226 | let get_env = |env| (!ignore_environment).then(|| env::var_os(env)).flatten(); |
| 227 | |
| 228 | let env_count = |env| { |
| 229 | get_env(env).filter(|v| !v.is_empty()).map_or(0, |val| { |
| 230 | val.to_str().and_then(|v| v.parse::<u8>().ok()).unwrap_or(1) |
| 231 | }) |
| 232 | }; |
| 233 | |
| 234 | settings.optimize = cmp::max(args.optimize, env_count("PYTHONOPTIMIZE")); |
| 235 | settings.verbose = cmp::max(args.verbose, env_count("PYTHONVERBOSE")); |
| 236 | settings.debug = cmp::max(args.debug, env_count("PYTHONDEBUG")); |
| 237 | |
| 238 | let env_bool = |env| get_env(env).is_some_and(|v| !v.is_empty()); |
| 239 | |
| 240 | settings.user_site_directory = |
| 241 | !(settings.isolated || args.no_user_site || env_bool("PYTHONNOUSERSITE")); |
| 242 | settings.quiet = args.quiet; |
| 243 | settings.write_bytecode = !(args.dont_write_bytecode || env_bool("PYTHONDONTWRITEBYTECODE")); |
| 244 | settings.safe_path = settings.isolated || args.safe_path || env_bool("PYTHONSAFEPATH"); |
| 245 | settings.inspect = args.inspect || env_bool("PYTHONINSPECT"); |
| 246 | settings.interactive = args.inspect; |
| 247 | settings.buffered_stdio = !args.unbuffered; |
| 248 | |
| 249 | if let Some(val) = get_env("PYTHONINTMAXSTRDIGITS") { |
| 250 | settings.int_max_str_digits = match val.to_str().and_then(|s| s.parse().ok()) { |
| 251 | Some(digits @ (0 | 640..)) => digits, |
| 252 | _ => { |
| 253 | error!( |
| 254 | "Fatal Python error: config_init_int_max_str_digits: PYTHONINTMAXSTRDIGITS: invalid limit; must be >= 640 or 0 for unlimited.\nPython runtime state: preinitialized" |
| 255 | ); |
| 256 | std::process::exit(1); |
| 257 | } |
| 258 | }; |
| 259 | } |
| 260 | |
| 261 | settings.check_hash_pycs_mode = args.check_hash_based_pycs; |
| 262 | |
| 263 | if let Some(val) = get_env("PYTHONUTF8") |
| 264 | && let Some(val_str) = val.to_str() |
| 265 | && !val_str.is_empty() |