electron 打包电子应用程序后无法访问python错误:spawn python ENOENT

bis0qfac  于 6个月前  发布在  Electron
关注(0)|答案(1)|浏览(163)

我已经准备好了我的应用程序,它可以完美地运行npm start(相当于electron .),但是当我用electron builder打包应用程序时,我不再可以访问python。脚本不会运行,并且它给出错误“Error:spawn python ENOENT”。应用程序的其余部分工作正常,但是我没有访问python的功能。我已经在这上面花了几个小时都没有用。下面是在main.js中调用python的地方,pythonPath是python所在的位置,我已经仔细检查过了。最初我根本没有env参数,但这是另一个论坛上建议的解决方案,它不起作用。

const pythonPath = '/Users/myname/miniconda3/bin/python'; 
log.info("process.env.PYTHON_PATH", process.env.PYTHON_PATH)
const env = Object.create(process.env);
env.PATH = `${pythonPath}:${env.PATH}`;
const { spawn } = require('child_process');
const pythonProcess = spawn('python', [path.join(process.resourcesPath, '../flask-server/server.py')], {
    env: env
});

字符串
首先,我认为文件路径是错误的,所以添加了一些测试,发现路径是正确的,它存在(路径到.py文件是)。接下来,我想可能是有什么问题的python评估,所以我切换到一个exec,我正在调用“python -c path/to/my/file.py“直接。与此同时,我得到了错误“错误执行Python脚本:. python:command not found”.这让我相信,无论出于何种原因,node.js能够在我运行开发版本时访问我的计算机的python,但在构建后发生了一些变化,它无法再访问python。我已经检查了文件权限,这也没有改变任何东西。提前感谢您的帮助。
package.json:

{
    "name": "app-name",
    "version": "1.0.0",
    "description": "app description",
    "main": "main.js",
    "author": "Rocky",
    "license": "MIT",
    "devDependencies": {
        "electron": "^27.1.3",
        "electron-builder": "^24.9.1"
    },
    "scripts": {
        "start": "electron .",
        "package": "electron-builder"
    },
    "build": {
        "appId": "app-name",
        "directories": {
            "output": "dist"
        },
        "extraFiles": [
            {
                "from": "flask-server",
                "to": "flask-server",
                "filter": [
                    "**/*"
                ]
            }
        ],
        "win": {
            "target": "nsis",
            "icon": "windows_icon.ico"
        },
        "mac": {
            "target": "dmg",
            "icon": "mac_icon.icns"
        },
        "linux": {
            "target": "AppImage"
        }
    },
    "dependencies": {
        "electron-log": "^5.0.1",
        "fix-path": "^4.0.0"
    }
}

mv1qrgav

mv1qrgav1#

对于任何有类似问题的人,我无法解决这个错误,但我找到了一个解决方案,将python可执行文件作为extraFile包含在内。这个应用程序有一些繁重的python逻辑,所以我包含了整个miniconda文件夹,通过将以下内容添加到extraFiles部分来修改package.json

"extraFiles": [
    {
        "from": "flask-server",
        "to": "flask-server",
        "filter": [
            "**/*"
        ]
    },
    {
        "from": "miniconda3",
        "to": "miniconda3",
        "filter": [
            "**/*"
        ]
    }
],

字符串
为了在打包/部署的应用程序中访问这些文件(使用electron-builder,来自main.js),我使用

const pythonPath = path.join(process.resourcesPath, '../miniconda3/bin/python');
const env = Object.create(process.env);
env.PATH = `${pythonPath}:${env.PATH}`;
const { spawn } = require('child_process');
const pythonProcess = spawn(pythonPath, [path.join(process.resourcesPath, '../flask-server/server.py')], {
    env: env
});


路径在生产和过程中会发生一些变化。resourcesPath将始终返回打包应用程序中resources文件夹的路径。希望这对您有帮助。

相关问题