如何从Javascript或Nodejs执行Python脚本?

时间:2019-05-13 12:52:58

标签: javascript python html node.js

我正在尝试将python输出中的列表用于HTML表单的下拉菜单中。

我有一个内置HTML / CCS的网站,一个带有nodeJS的服务器以及一些我想在python3中使用的脚本。

我测试了多个丁字裤,但我无法使其正常工作。

  1. 我尝试放入一些Javascript,但无法从python脚本中获取信息

  2. 我尝试从nodeJS运行脚本,但是该脚本花费大量时间,因此无法正常工作。

这是我的app.js:

app.post("/getData", function (request, response) {
    var IP = request.body.IP;
    var user = request.body.user;
    var password = request.body.password;
    const testscript = exec('python getCPG.py ' + IP + user + password);
    console.log("test1");
    testscript.stdout.on('data', function (data) {
        console.log("test2");
        console.log(data);
        // sendBackInfo();
    });
    //response.sendFile(path.join(__dirname + '/public/views/indexwithIP.html'));
    //app.post("/LUNProvisionning", function (request, response) {
    //    console.log(request.body.serveur);
    //    console.log(request.body.volumetrie);
    //    console.log(request.body.type);
    //    response.sendFile(path.join(__dirname + '/public/views/index.html'));
    //});

    response.sendFile(path.join(__dirname + '/public/views/index.html'));
});

这是我的html表单:

    <form action="/getData" method="post" name="getData">
        <fieldset>
            <legend>LUN Provisionning</legend>
            <label>IP baie : </label>
            <input name="IP" id="IP" required>
            <br />
            <label>user baie : </label>
            <input type="text" placeholder="3paradm" name="user" id="userbaie" required>
            <label>Password baie : </label>
            <input type="password" name="password" id="PWbaie" required>
            <br />
        </fieldset>
    </form>

这会将数据发送到运行python脚本的服务器。但是服务器需要太多时间才能获得答案。 然后,我将尝试将答案放入下拉列表中。我必须创建2个表单,否则使用JavaSscript并放置一个按钮将无法正常工作。

这是我的python脚本的输出:

SSD_r1
SSD_r5
SSD_r6
fs_cpg
CPG4S2

编辑“添加python脚本” 这是python脚本:

from hpe3parclient import client, exceptions
import sys

IPbaie = sys.argv[1]
userbaie = sys.argv[2]
pwbaie = sys.argv[3]

cl = client.HPE3ParClient("http://" + IPbaie + ":8008/api/v1")
cl.setSSHOptions(IPbaie, userbaie, pwbaie)

def getCPG():
#retourn une liste
        temp = []
        cpg = cl.getCPGs()
        listcpg = cpg['members']
        for x in listcpg:
                temp.append(x.get('name'))
        return(temp)

try:
    cl.login(userbaie, pwbaie)
    print("login successful.")
except exceptions.HTTPUnauthorized as ex:
    print ("login failed.")
try:
    listcpg = getCPG()
    for x in listcpg:
        print (x)
except exceptions.HTTPUnauthorized as ex:
    print ("You must login first")
except Exception as ex:
    print (ex)

cl.logout()
print ("logout worked")

谢谢

3 个答案:

答案 0 :(得分:1)

根据https://www.npmjs.com/package/exec

,由于child_process.execFile已被弃用,如何使用exec
const {execFile} = require('child_process');
const testscript = execFile('python3', ['file_name.py', 'command_line_arg1', 'command_line_arg2', 'command_line_arg3'], (error, stdout, stderr) => {
    if (error) throw error;
    console.log(stdout);
    })

这将打印python文件中的每个print语句。因此,我建议您删除它们。

答案 1 :(得分:0)

我建议在您的服务器Python脚本之前放置一个API。这在前端和后端之间增加了一层抽象(这对安全性很有用)。您的javascript函数可以调用API端点,并检索输出。

关于python脚本的速度:不知道如何在不了解代码的情况下如何提供帮助。

答案 2 :(得分:0)

似乎脚本名称后应该有一个空格字符:

const testscript = exec('python getCPG.py ' + IP + user + password);