2016-05-19 4 views
1

Я пытаюсь выполнить скрипт Python, когда я нажимаю кнопку HTML. Оба файла находятся на сервере Node.js. Когда я нажимаю кнопку, я получаю это сообщение в консоли браузера:Выполнять скрипт Python с Node.js

app.js:5 Uncaught ReferenceError: runPython is not defined 

Я не знаю, как написать мой скрипт AJAX для вызова функции runPython() в моем файле веб-сервера узла. Ниже мой код:

index.html

<!DOCTYPE html> 
<html> 
<head> 
<title>Page Title</title> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.3/jquery.js">  </script> 
</head> 
<body> 

<button id="myButton">Run Python Script</button> 

<script src="app.js"></script> 
</body> 
</html> 

app.js

$('#myButton').click(function() { 
    $.ajax({ 
     url: "", 
     success: function(data) { 
     runPython(); 
     }, 
    }); 
}); 

webserver.js (Node.js)

'use strict'; 
const http = require('http'); 
const url = require('url'); 
const fs = require('fs'); 
const path = require('path'); 

let mimes = { 
    '.htm': 'text/html', 
    '.css': 'text/css', 
    '.js': 'text/javascript' 
} 

//Have ajax call it to execute Python Script 
function runPython(){ 
    let exec = require('child_process').exec; 
    exec('python myscript.py', (error, stdout, stderr) => { 
     console.log(stdout); 
    }); 
} 

function fileAccess(filepath) { 
    return new Promise((resolve, reject) => { 
    fs.access(filepath, fs.F_OK, error => { 
     if(!error) { 
     resolve(filepath); 
     } else { 
     reject(error); 
     } 
    }); 
    }); 
} 

function streamFile(filepath) { 
    return new Promise((resolve, reject) => { 
     let fileStream = fs.createReadStream(filepath); 

     fileStream.on('open',() => { 
      resolve(fileStream); 
     }); 

     fileStream.on('error', error => { 
      reject(error); 
     }); 
     }); 
} 

function webserver(req, res) { 
    // if the route requested is '/', then load 'index.htm' or else 
    // load the requested file(s) 

    let baseURI = url.parse(req.url); 
    let filepath = __dirname + (baseURI.pathname === '/' ? '/index.htm' : baseURI.pathname); 
    let contentType = mimes[path.extname(filepath)]; 

    fileAccess(filepath) 
    .then(streamFile) 
    .then(fileStream => { 
     res.writeHead(200, {'Content-type': contentType}); 
     //res.end(content, 'utf-8'); 
     fileStream.pipe(res); 
    }) 
    .catch(error => { 
     res.writeHead(404); 
     res.end(JSON.stringify(error)); 
    }); 


} 

http.createServer(webserver).listen(3000,() => { 
    console.log('Webserver running on port 3000'); 
}); 

Как я должен написать AJAX кода, чтобы выполнялась функция в webserver.js?

ответ

0

Браузер загружает скрипт по этому URL-адресу. Это рассматривается как данные или текст. Браузеры, как правило, не запускают Python, поэтому работайте по назначению.

+0

Должен быть способ запуска скрипта Python при нажатии кнопки. Что мне нужно изменить в моем коде для запуска скрипта? – user3062459

+0

@ user3062459 Возможно, он может работать на стороне сервера, если все настроено правильно. Вам нужно будет настроить обработчик, который выполнит выполнение питона при запросе правильного URL-адреса. https://nodejs.org/api/child_process.html. Более сложным способом было бы установить и использовать что-то вроде: https://github.com/extrabacon/python-shell, который немного отличается по стилю. – dlamblin

0

Вам необходимо сделать запрос ajax на сервер, на котором будет запущен некоторый код, который будет вызывать ваш скрипт python. Вам не хватает средней части этого процесса и просто запрашивает содержимое myscript.py как текст.

Что-то вроде:

$('#myButton').click(function() { 
    $.ajax({ 
     url: "/invoke-script" 
    }); 
}); 

Я не знаком с узлом, но я полагаю, у вас есть какой-то контроллер и возможность выполнения команд (возможно, с помощью https://www.npmjs.com/package/exec-sync). В этом контроллере вы затем вызываете свой скрипт python и выполняете то, что вам нужно с выходом.

0

Подумайте об этом скрипте как исполняемом файле. Если ваш URL указывает на некоторый * .exe-файл, щелчок по URL-адресу указывает веб-браузеру загрузить этот ресурс. То же самое происходит с скриптом Python. Если вы хотите запустить некоторый код python, попробуйте вместо этого обратиться к HTTP-запросу с помощью простого HTTP-сервера. Это наиболее распространенный способ выполнить некоторые действия по HTTP-запросу. Проверьте документацию для SimpleHTTPServer и BaseHTTPServer. Here и here вы можете найти фрагмент кода для простой реализации сервера.

Смежные вопросы