Search code examples
rreticulate

Why is reticulate::py_available() FALSE until I I run reticulate::py_run_string("")?


Why do I first have to submit something through reticulate::py_run_string() for reticulate::py_available() to return TRUE?

I ran the below set of calls through a clean R session:

> packageVersion("reticulate")
[1] ‘1.40.0’
> reticulate::py_available()
[1] FALSE
> Sys.setenv(RETICULATE_PYTHON = "/usr/bin/python3")
> reticulate::py_available()
[1] FALSE
> reticulate::py_run_string("")
> reticulate::py_available()
[1] TRUE

Solution

  • py_run_string("") triggers Python initialization while py_available() by default does not, it only checks if Python is already initialized in current R session. Though you can set initialize to change that behaviour.

    Or perhaps it's reticulate::py_discover_config() you are after -- it does not load Python, just attempts to figure out config:

    # discover config without initializing python
    reticulate::py_discover_config()$python
    #> [1] "C:/Users/margusl/miniforge3/envs/py312/python.exe"
    reticulate::py_available()
    #> [1] FALSE
    
    # force init before checking:
    reticulate::py_available(initialize = TRUE)
    #> [1] TRUE
    reticulate::py_available()
    #> [1] TRUE