节点集成在Electron中不起作用?

时间:2019-06-21 10:51:36

标签: javascript python node.js electron

我正在使用Python 3.7编写的后端创建清单应用程序。我正在使用Electron为其构建GUI,并使用Node.js模块“ python-shell”来与Python代码进行通信。我希望python-shell的所有代码都在单独的JavaScript文件(connector.js)中。如果我仅从命令行运行带有节点的文件,它就可以正常工作,但是从HTML Button调用该函数不起作用。

我知道在默认情况下对Electron nodeIntegration的最新更新之一是false,但是我确实将其设置为true。不幸的是,它仍然不允许我在Electron渲染器过程中与Node模块通信。如果我将connector.js代码复制到Electron使用的main.js文件中,并在应用程序启动时调用它,那么它确实可以工作,但是使用HTML按钮调用它显然也不起作用。

这是将nodeIntegration设置为true的Electron的main.js文件。


const {app, BrowserWindow, Menu} = require('electron')
const fs = require('fs')

let mainWindow

function createWindow() {
    mainWindow = new BrowserWindow({
        // Set fixed size of main window
        width: 1280,
        height: 768,
        resizable: false,
        webPrefrences: {
            nodeIntegration: true,
        }
    })

    mainWindow.loadFile('./main.html')

    mainWindow.on('closed', function () {
        mainWindow = null
    })

    //Opens the dev tools by default.
    mainWindow.webContents.openDevTools();
}

// Disable the default Menu Bar
Menu.setApplicationMenu(null)

app.on('ready', createWindow)

app.on('window-all-closed', function () {
    if (process.platform !== 'darwin') app.quit()
})

app.on('activate', function () {
    if (mainWindow === null) createWindow()
})

这是connector.js文件,它使用正确的参数调用Python脚本。 functional.py用于测试一个非常简单的脚本,该脚本使用第一个命令行参数(在本例中为addNewDataset)来调用函数,第二个作为其创建的文件名。


const {PythonShell} = require('python-shell')

var options = {
    mode: 'text',
    encoding: 'utf8',
    pythonPath: 'python3',
    pythonOptions: ['-u'],
    scriptPath: './',
    args: ['addNewDataset', 'testDataset123']
};

function test() {
    PythonShell.run('functionality.py', options, function (err) {
        if (err) throw err;
        console.log('done');
    });
}

使用简单的脚本标签将其加载到HTML文件中

<script src="connector.js"></script>

并使用输入进行调用

<input type="submit" value="Button" onclick="test()">

我很确定我只是误解了Electron以及主进程和渲染器进程的工作方式。不幸的是,无论我在Internet上寻找什么,我似乎都无法获得切实可行的解决方案。

1 个答案:

答案 0 :(得分:0)

在您的python文件中添加<div id='auth_top'> <div id='auth'> <a id='auth_google_link' href="/auth/google"> <img id='auth_google_img' src='data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRw%0D%0AOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgNDggNDgiPjxkZWZzPjxwYXRo%0D%0AIGlkPSJhIiBkPSJNNDQuNSAyMEgyNHY4LjVoMTEuOEMzNC43IDMzLjkgMzAuMSAzNyAyNCAzN2Mt%0D%0ANy4yIDAtMTMtNS44LTEzLTEzczUuOC0xMyAxMy0xM2MzLjEgMCA1LjkgMS4xIDguMSAyLjlsNi40%0D%0ALTYuNEMzNC42IDQuMSAyOS42IDIgMjQgMiAxMS44IDIgMiAxMS44IDIgMjRzOS44IDIyIDIyIDIy%0D%0AYzExIDAgMjEtOCAyMS0yMiAwLTEuMy0uMi0yLjctLjUtNHoiLz48L2RlZnM+PGNsaXBQYXRoIGlk%0D%0APSJiIj48dXNlIHhsaW5rOmhyZWY9IiNhIiBvdmVyZmxvdz0idmlzaWJsZSIvPjwvY2xpcFBhdGg+%0D%0APHBhdGggY2xpcC1wYXRoPSJ1cmwoI2IpIiBmaWxsPSIjRkJCQzA1IiBkPSJNMCAzN1YxMWwxNyAx%0D%0AM3oiLz48cGF0aCBjbGlwLXBhdGg9InVybCgjYikiIGZpbGw9IiNFQTQzMzUiIGQ9Ik0wIDExbDE3%0D%0AIDEzIDctNi4xTDQ4IDE0VjBIMHoiLz48cGF0aCBjbGlwLXBhdGg9InVybCgjYikiIGZpbGw9IiMz%0D%0ANEE4NTMiIGQ9Ik0wIDM3bDMwLTIzIDcuOSAxTDQ4IDB2NDhIMHoiLz48cGF0aCBjbGlwLXBhdGg9%0D%0AInVybCgjYikiIGZpbGw9IiM0Mjg1RjQiIGQ9Ik00OCA0OEwxNyAyNGwtNC0zIDM1LTEweiIvPjwv%0D%0Ac3ZnPg=='/> </a> </div> </div>。看起来像这样:

module.exports

当您需要html文件作为变量时,上述代码将公开您的函数。像这样的html文件:

module.exports = {
    test: function () {
        PythonShell.run('functionality.py', options, function (err) {
            if (err) throw err;
            console.log('done');
        });
    }
}

我尚未在IDE中测试代码,因此对任何语法错误深表歉意。


有关在模块中导出功能的更多信息:In Node.js, how do I "include" functions from my other files?