29

Currently I have some Python files which connect to an SQLite database for user inputs and then perform some calculations which set the output of the program. I'm new to Python web programming and I want to know: What is the best method to use Python on the web?

Example: I want to run my Python files when the user clicks a button on the web page. Is it possible?

I started with Django. But it needs some time for the learning. And I also saw something called CGI scripts. Which option should I use?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Ann
  • 403
  • 2
  • 5
  • 17

9 Answers9

16

You are able to run a Python file using HTML using PHP.

Add a PHP file as index.php:

<html>
<head>
<title>Run my Python files</title>
<?PHP
echo shell_exec("python test.py 'parameter1'");
?>
</head>

Passing the parameter to Python

Create a Python file as test.py:

import sys
input=sys.argv[1]
print(input)

Print the parameter passed by PHP.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Integraty_dev
  • 500
  • 3
  • 18
  • Neat! To support spaces in your argument, try doing this instead: `echo shell_exec("python test.py \"Parameter 1\"");` – Professor Dragon Apr 30 '20 at 02:22
  • 1
    There is a whole lot of context missing here (for example, prerequisites). On some Linux server somewhere? Where? Running locally? On a Linux computer? With both the PHP and Python interpreters installed? Where and with what versions was this tested? Please respond by [edit]ing (changing) your answer, not here in comments (***without*** "Edit:", "Update:", or similar - the answer should appear as if it was written today). – Peter Mortensen May 29 '22 at 16:34
7

It probably would depend on what you want to do. I personally use CGI and it might be simpler if your inputs from the web page are simple, and it takes less time to learn. Here are some resources for it:

However, you may still have to do some configuring to allow it to run the program instead of displaying it.

Here's a tutorial on that: Apache Tutorial: Dynamic Content with CGI

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
abacles
  • 849
  • 1
  • 7
  • 15
4

Thanks to WebAssembly and the Pyodide project, it is now possible to run Python in the browser. Check out this tutorial on it.

Update: Pyodide v0.21.0

(async () => { // create anonymous async function to enable await

  var output = document.getElementById("output")
  var code = document.getElementById("code")
  
  output.value = 'Initializing...\n'

  window.pyodide = await loadPyodide({stdout: addToOutput, stderr: addToOutput}) // redirect stdout and stderr to addToOutput
        output.value += 'Ready!\n' 
})()


function addToOutput(s) {
  output.value += `${s}\n`
  output.scrollTop = output.scrollHeight
}

async function evaluatePython() {
  addToOutput(`>>>${code.value}`)

  await pyodide.loadPackagesFromImports(code.value, addToOutput, addToOutput)
  try {
    let result = await pyodide.runPythonAsync(code.value)
    addToOutput(`${result}`)
  }
  catch (e) {
    addToOutput(`${e}`)
  }
  code.value = ''
}
<script src="https://cdn.jsdelivr.net/pyodide/v0.21.3/full/pyodide.js"></script>

Output:
<textarea id="output" style="width: 100%;" rows="10" disabled=""></textarea>
<textarea id="code" rows="3">import numpy as np
np.ones((10,))
</textarea>
<button id="run" onclick="evaluatePython()">Run</button>

Old answer (related to Pyodide v0.15.0)

const output = document.getElementById("output")
const code = document.getElementById("code")

function addToOutput(s) {
    output.value += `>>>${code.value}\n${s}\n`
    output.scrollTop = output.scrollHeight
    code.value = ''
}

output.value = 'Initializing...\n'
// Init pyodide
languagePluginLoader.then(() => { output.value += 'Ready!\n' })

function evaluatePython() {
    pyodide.runPythonAsync(code.value)
        .then(output => addToOutput(output))
        .catch((err) => { addToOutput(err) })
}
<!DOCTYPE html>

<head>
    <script type="text/javascript">
        // Default Pyodide files URL ('packages.json', 'pyodide.asm.data', etc.)
        window.languagePluginUrl = 'https://cdn.jsdelivr.net/pyodide//v0.15.0/full/';
    </script>
    <script src="https://cdn.jsdelivr.net/pyodide//v0.15.0/full/pyodide.js"></script>
</head>

<body>
    Output:
    </div>
    <textarea id='output' style='width: 100%;' rows='10' disabled></textarea>
    <textarea id='code' rows='3'>
import numpy as np
np.ones((10,))
    </textarea>
    <button id='run' onclick='evaluatePython()'>Run</button>
    <p>You can execute any Python code. Just enter something
       in the box above and click the button.
       <strong>It can take some time</strong>.</p>
</body>

</html>
Aray Karjauv
  • 2,679
  • 2
  • 26
  • 44
3

If your web server is Apache you can use the mod_python module in order to run your Python CGI scripts.

For nginx, you can use mod_wsgi.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Danny Cullen
  • 1,782
  • 5
  • 30
  • 47
  • 2
    The mod_python project is long dead and shouldn't be used for anything new. The option for Apache, not nginx as you have it, is mod_wsgi, but the Google Code site is old site which is no longer used, use http://www.modwsgi.org instead. – Graham Dumpleton Nov 29 '16 at 11:59
1

There is a way to do it with Flask!

Installation

First you have to type pip install flask.

Setup

You said when a user clicks on a link you want it to execute a Python script

from flask import *
# Importing all the methods, classes, functions from Flask

app = Flask(__name__)

# This is the first page that comes when you
# type localhost:5000... it will have a tag
# that redirects to a page
@app.route("/")
def  HomePage():
    return "<a href='/runscript'>EXECUTE SCRIPT </a>"

# Once it redirects here (to localhost:5000/runscript),
# it will run the code before the return statement
@app.route("/runscript")
def ScriptPage():
    # Type what you want to do when the user clicks on the link.
    #
    # Once it is done with doing that code... it will
    # redirect back to the homepage
    return redirect(url_for("HomePage"))

# Running it only if we are running it directly
# from the file... not by importing
if __name__ == "__main__":
    app.run(debug=True)
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
1

There's a new tool, PyScript, which might be helpful for that.

Official website

GitHub repository

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Aidas
  • 114
  • 4
  • 1
    The examples in that GitHub repository are actively available to try online at https://pyscript.net/examples/ . – Wayne May 09 '22 at 15:07
  • 1
    While this link may answer the question, it is better to include the essential parts of the answer here and provide the link for reference. Link-only answers can become invalid if the linked page changes. - [From Review](/review/late-answers/31730773) – Emi OB May 12 '22 at 15:13
  • This project is also based on [Pyodide](https://github.com/pyodide/pyodide) – Aray Karjauv May 29 '22 at 19:14
0

You can't run Python code directly

You may use Python Inside HTML.

Or for inside PHP this:

http://www.skulpt.org/
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Hemel
  • 431
  • 3
  • 15
  • The second link is broken (DNS domain expiry?): *"Hmm. We’re having trouble finding that site.. We can’t connect to the server at www.skulpt.org."* – Peter Mortensen May 29 '22 at 16:26
0

You should try the Flask or Django frameworks. They are used to integrate Python and HTML.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Anandakrishnan
  • 349
  • 5
  • 10
0

You should use Py Code because it could run Any python script In html Like this:

<py-script>print("Python in Html!")<py-script>

Im not sure if it could run modules like Ursina engine ect But what i know is That It allows you to type Python in Html. You can check out its offical Site for more info.