Как запустить python скрипт на сайте, чтобы пользователь мог взаимодействовать с ним?
Мне нужна помощь, дело в том, что мне нужно сделать так, чтобы на сайте запускался py скрипт,желательно сделать это по кнопке. Нужно чтобы пользователь мог взаимодействовать с ним, то есть в py скрипте будут спрашиваться значения. И к python скрипту прилагается еще файл, ну пусть будет config.txt, нужно чтобы пользователь мог туда добавлять значения. Как это сделать?
P.s на сайте используется wp(если это играет значение).
Ответы (3 шт):
Возможно использовать CGI-скрипты на Python, если хостинг это поддерживает. На сколько я знаю, reg.ru и вроде как beget работают.
https://pythonworld.ru/web/cgi-1.html
Если знаете веб-фреймворк, по типу Flask и Django, то можете запустить их на отдельном порту и настроить прокси через nginx/apache.
можно с помощью функции exec() с записью исходящих данных в массив.
например:
exec("python3.5 /PATH/TO/FILE/SCRIPT.py {$input_params_string}", $output_response_array);
print_r($output_response_array);
где $input_params_string строка данных, разделенных пробелом, например:
$input_params_string = implode(' ', array( // В этом случае ключи не будут переданы
'user_id' => 1,
'user_pass' => 123,
'user_status' => 'OK',
));
и обработанная на стороне Python-скрипта, например:
import sys
print(sys.argv[1]) #user_id
print(sys.argv[2]) #user_pass
print(sys.argv[3]) #user_status
print ("Hello World!")
Вся информация, выведенная функцией print() в Python-скрипте, будет записана в массив $output_response_array PHP-скрипта
Недавно пробовал, тут https://github.com/alex-eri/jsterm
import asyncio
from aiohttp import web
import aiohttp
import os
import pty
import fcntl
async def websocket_handler(request):
ws = web.WebSocketResponse()
await ws.prepare(request)
loop = asyncio.get_running_loop()
master, slave = pty.openpty() # создаем новую консоль
name = os.ttyname(slave)
pid = os.fork() # отделяемся в новый процесс
if pid == 0:
os.setsid()
os.dup2(slave,0) # подключаем его к созданной ранее консоли
os.dup2(slave,1)
os.dup2(slave,2)
os._exit(os.execv('/usr/bin/ipython3',('python@ws', ))) # запускаем там програмку
# os._exit(os.execv('/usr/bin/python3',('python@ws', '/opt/project/script.py')))
# os._exit(os.execv('/usr/bin/su',('login@ws', '-', 'eri')))
stdin = os.fdopen(master, 'wb+', buffering=0)
fl = fcntl.fcntl(master, fcntl.F_GETFL)
fcntl.fcntl(master, fcntl.F_SETFL, fl | os.O_NONBLOCK)
def pipe_data_received(ws):
data = stdin.read()
try:
asyncio.ensure_future(ws.send_str(data.decode()))
except:
os.kill(pid,15)
loop.add_reader(master, pipe_data_received, ws) # читаем консоль
async for msg in ws: # читаем ввод пользователя
if msg.type == aiohttp.WSMsgType.TEXT:
stdin.write(msg.data.encode())
elif msg.type == aiohttp.WSMsgType.BINARY:
stdin.write(msg.data)
elif msg.type == aiohttp.WSMsgType.CLOSE:
await ws.close()
os.kill(pid,15)
elif msg.type == aiohttp.WSMsgType.CLOSED:
os.kill(pid,15)
elif msg.type == aiohttp.WSMsgType.ERROR:
os.kill(pid,15)
os.kill(pid,15)
os.waitpid(pid, 0)
return ws
app = web.Application()
app.add_routes([web.get('/term', websocket_handler)])
web.run_app(app)
<!doctype html>
<html style="padding:0;margin:0">
<head>
<link rel="stylesheet" href="node_modules/xterm/css/xterm.css" />
<script src="node_modules/xterm/lib/xterm.js"></script>
<script src="node_modules/xterm-addon-fit/lib/xterm-addon-fit.js"></script>
<script src="node_modules/xterm-addon-attach/lib/xterm-addon-attach.js"></script>
</head>
<body style="padding:0;margin:0">
<div id="terminal" style="height:100vh"></div>
<script>
const term = new Terminal();
const socket = new WebSocket('ws://localhost:8080/term');
const attachAddon = new AttachAddon.AttachAddon(socket);
const fitAddon = new FitAddon.FitAddon();
term.loadAddon(fitAddon);
term.loadAddon(attachAddon);
term.open(document.getElementById('terminal'));
fitAddon.fit();
</script>
</body>
</html>
Запускается экземпляр питона, на вэб сокете соединяет с яваскриптом на сайте и можно в реальном времени поработать с консолью python или укажите параметры запуска вашего скрипта.