Usage
How to use react-py
in your project. For framework specific guides, see the sidebar.
PythonProvider
Provider
First, wrap your app in a PythonProvider
component. For props, see the API reference docs.
import { PythonProvider } from 'react-py'
function App() {
return (
// Add the provider to your app
<PythonProvider>
<Codeblock />
</PythonProvider>
)
}
render(<App />, document.getElementById('root'))
usePython
Hook
Use the usePython
hook to run code and access both stdout and stderr. For props, see the API reference docs.
Try the example, Basic Example.
import { useState } from 'react'
import { usePython } from 'react-py'
function Codeblock() {
const [input, setInput] = useState('')
// Use the usePython hook to run code and access both stdout and stderr
const { runPython, stdout, stderr, isLoading, isRunning } = usePython()
return (
<>
{isLoading ? <p>Loading...</p> : <p>Ready!</p>}
<form>
<textarea
onChange={(e) => setInput(e.target.value)}
placeholder="Enter your code here"
/>
<input
type="submit"
value={!isRunning ? 'Run' : 'Running...'}
disabled={isLoading || isRunning}
onClick={(e) => {
e.preventDefault()
runPython(input)
}}
/>
</form>
<p>Output</p>
<pre>
<code>{stdout}</code>
</pre>
<p>Error</p>
<pre>
<code>{stderr}</code>
</pre>
</>
)
}
usePythonConsole
Hook
Use the usePythonConsole
hook to emulate a Python console to run code and access both stdout and stderr. For props, see the API reference docs.
Try the example, REPL.
note
The Python console is not affected by the globally set lazy
or terminateOnCompletion
props.
import { useEffect, useState } from 'react'
import { usePythonConsole } from 'react-py'
import { ConsoleState } from 'react-py/dist/types/Console'
function Codeblock() {
const [input, setInput] = useState('')
const [output, setOutput] = useState('')
const {
runPython,
stdout,
stderr,
isLoading,
isRunning,
banner,
consoleState
} = usePythonConsole()
useEffect(() => {
setOutput((prev) => [...prev, stdout])
}, [stdout])
useEffect(() => {
setOutput((prev) => [...prev, stderr])
}, [stderr])
function getPrompt() {
return consoleState === ConsoleState.incomplete ? '... ' : '>>> '
}
function run() {
setOutput((prev) => [...prev, getPrompt() + input + '\n'])
runPython(input)
}
return (
<>
{isLoading ? <p>Loading...</p> : <p>Ready!</p>}
<p>
<b>Output</b>
</p>
<pre>
{banner}
<br />
{output}
</pre>
<pre>
{getPrompt()}
<form>
<textarea
onChange={(e) => setInput(e.target.value)}
placeholder="Enter your code here"
/>
<input
type="submit"
value={!isRunning ? 'Run' : 'Running...'}
disabled={isLoading || isRunning}
onClick={(e) => {
e.preventDefault()
run()
}}
/>
</form>
</pre>
</>
)
}