indygreg / PyOxidizer

A modern Python application packaging and distribution tool
Mozilla Public License 2.0
5.41k stars 234 forks source link

pyoxidizer init-rust-project does not works as documented #335

Open the-ica opened 3 years ago

the-ica commented 3 years ago

pyoxidizer init-rust-project pyapp

I then modified src/main.rs :

#![windows_subsystem = "console"]

use pyembed::MainPythonInterpreter;

// Include an auto-generated file containing the default
// pyembed::OxidizedPythonInterpreterConfig derived by the PyOxidizer
// configuration file.
//
// If you do not want to use PyOxidizer to generate this file, simply
// remove this line and instantiate your own instance of
// pyembed::OxidizedPythonInterpreterConfig.
include!(env!("PYOXIDIZER_DEFAULT_PYTHON_CONFIG_RS"));

fn main() {
    // The following code is in a block so the MainPythonInterpreter is destroyed in an
    // orderly manner, before process exit.
    let code = {
        // Load the default Python configuration as derived by the PyOxidizer config
        // file used at build time.
        let config = default_python_config();

        // Construct a new Python interpreter using that config, handling any errors
        // from construction.
        match MainPythonInterpreter::new(config) {
            Ok(mut interp) => {
                // And run it using the default run configuration as specified by the
                // configuration. If an uncaught Python exception is raised, handle it.
                // This includes the special SystemExit, which is a request to terminate the
                // process.
                // interp.run_as_main()
                let py = interp.acquire_gil().unwrap();
                match py.eval( "print('hello, world')", None, None) {
                    Ok(_) => println!("python code executed successfully"),
                    Err(e) => println!("python error: {:?}", e),
                }
                0
            }
            Err(msg) => {
                eprintln!("{}", msg);
                1
            }
        }
    };

    // And exit the process according to code execution results.
    std::process::exit(code);
}

but when running

pyoxidizer run

I get the same python REPL as without modification !

And also,

cargo run --features jemalloc build-mode-pyoxidizer-exe

fail with

Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized
ModuleNotFoundError: No module named 'encodings'

That may be normal, but nothing tell me why in the doc.

I'm using ubuntu 20.04 and rust/cargo 1.47

noahssarcastic commented 3 years ago

I am also having this problem but I haven't changed the sample rust project except for enabling jemalloc in Cargo.toml. Ubuntu 18.04.5 Rust 1.49.0 PyOxidizer 0.10.3

Skehmatics commented 1 year ago

What particularly bugs me about this is that the documentation mentions many times in relation to mixed python-rust projects to use pyoxidizer rather than cargo to build in order to perform many key steps you would otherwise need to glue together yourself, but doing so doesn't utilize any of your Rust code at all!

dae commented 1 year ago

Here's how I work around it: https://github.com/indygreg/PyOxidizer/pull/466