簡體   English   中英

電子生成器沒有捆綁 python 文件

[英]electron-builder is not bundling the python files

這是我的目錄結構,其中renderer.js包含在index.html python 腳本visitor.pydownload.py是通過python-shellrenderer.js調用的。 一旦我捆綁,它就無法找到 python 腳本

  |_ index.html
  |_ styles.css
  |_ main.js
  |_ package.json
  |_ dist/
  |_ node_modules/
  |_ renderer.js
  |_ visitor.py
  |_ download.py

我嘗試將所有內容放入files: [...] in package.jsonbuild > files然后運行npm run dist 我還嘗試將 python 文件顯式復制到dist文件夾,然后運行npm run dist 沒有人在工作。

/Application/test.app/Contents/Resources/app.asar/remderer.js:226 錯誤:python:無法打開文件“visitor.py”:[錯誤 2] 沒有那個文件或目錄

這是我的 package.json

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "start": "electron .",
    "pack": "build --dir",
    "dist": "build"
  },
  "author": "",
  "license": "ISC",
  "build": {
    "appId": "com.example.app",
    "files": [
      "dist/",
      "node_modules/",
      "index.html",
      "main.js",
      "package.json",
      "renderer.js",
      "styles.css",
      "visitor.py",
      "download.py"
    ],
    "dmg": {
      "contents": [
        {
          "x": 110,
          "y": 150
        },
        {
          "x": 240,
          "y": 150,
          "type": "link",
          "path": "/Applications"
        }
      ]
    },
    "linux": {
      "target": [
        "AppImage",
        "deb"
      ]
    },
    "win": {
      "target": "squirrel",
      "icon": "build/icon.ico"
    }
  },
  "dependencies": {
    "csv-parse": "^2.5.0",
    "electron-css": "^0.6.0",
    "npm": "^6.1.0",
    "python-shell": "^0.5.0",
  },
  "devDependencies": {
    "electron": "^2.0.3",
    "electron-builder": "^20.19.1"
  }
}

PS:這是我說的電子生成器https://github.com/electron-userland/electron-builder

請確保不是您的錯字

/Application/test.app/Contents/Resources/app.asar/remderer.js:226 Error: python: can't open file 'visitor.py': [Error 2] No such file or directoryremderer.js ,但是另一個地方是renderer.js ,所以請確保不是你的錯字。 如果是,請更正。


原因

其實electron-builder捆綁你的Python文件,但由於asar ,你python-shell無法找到你的Python文件,所以會導致錯誤。

怎么修

解決方案1:

最簡單但官方不推薦:禁用 asar

如何disable asar

將您的package.json更改為:

{
...
  "build": {
    "appId": "com.example.app",
...
    "asar": false,

然后在包含python-shell代碼的renderer.js ,可能是這樣的:

import {PythonShell} from 'python-shell';

PythonShell.run('visitor.py', null, function (err) {
  if (err) throw err;
  console.log('finished');
});

現在應該工作。

內在邏輯

禁用asar后,所有相關文件路徑不包含asar,變成這樣:

  • /Application/test.app/Contents/Resources/app/visitor.py
  • /Application/test.app/Contents/Resources/app/renderer.js

也就是說, .app文件結構是:

|_ test.app
    |_ Contents
        |_ Resources
            |_ app
                |_ styles.css
                |_ main.js
                |_ package.json
                |_ dist/
                |_ node_modules/
                |_ renderer.js
                |_ visitor.py
                |_ download.py
                ...

解決方案2:

保持啟用 asar,將額外的文件放入unpack

如何解壓

將您的package.json更改為:

{
...
  "build": {
    "appId": "com.example.app",
...
    "asar": true,
    "asarUnpack": [
      "visitor.py",
      "download.py"
      "renderer.js"
    ],

打包的.app文件結構是:

|_ test.app
    |_ Contents
        |_ Resources
            |_ app.asar             # a single compressed binary file
            |_ app.asar.unpacked    # a folder/directory, contain unpacked origin files
                |_ visitor.py
                |_ download.py
                |_ renderer.js

您的renderer.js也許不需要更改,並且應該可以工作。

有關asarUnpack更多詳細信息,請參閱官方文檔: Overridable per Platform Options


PS:其他一些asar和相關的嘗試,可以參考我的中文帖子: 【已解決】mac中PyInstaller打包后的二進制文件在electron-builder打包后app中某些無法通過child_process的execFile運行

您需要按如下方式指定它們:

    "extraFiles": [
        "from":"source path",
        "to":"your destination"
    ]

如果您想通過創建目錄來放置這些文件,請使用 extraResources

    "extraResources": [
        "from":"source path",
        "to":"some directory name"
    ]

有關更多信息,請參閱此處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM