我正在使用ElectronJs编写我的第一个应用程序,作为一个用Python编写的旧项目的GUI。当我从cmd运行我的Electron应用程序时,我可以使用提供的脚本成功激活python venv,运行用python编写的代码,并在脚本将结果导出为out/文件夹中的文件后停用venv。所有这些操作都是使用child_process.spawn()
方法处理的,并以我的命令作为参数启动一个powershell示例(我不知道是否有更好的方法,但这对我来说很有效!).
当我尝试用electron-builder打包我的Electron应用程序的可移植可执行文件时,我知道我用js编写的python管理器脚本可以运行,但我的python代码似乎无法运行,我认为我的相对路径不再起作用。
我使用以下路径作为我的python脚本:
const pythonScriptPath = path.join(__dirname, '../python/main.py');
项目结构:
root:
+ // other files
+ src:
|
+ js: //folder with all my js files
|
+ html: // folder for html
+ css: // fodlder for css
|
+ py: // all my python stuff in here
+ venv: // folder for my python env
+ // all my python scripts
我需要一种方法来正确定位我的文件,以便我的应用程序在导出为可移植的可执行文件时能够正确运行
编辑
我可以使用pyInstaller将我的python代码转换为可执行文件,这样我就不必处理所有venv的东西,但我不认为这会使我的生活更轻松,因为我不能执行文件(或以文件路径为参数的程序)
1条答案
按热度按时间m0rkklqb1#
这并不是说路径是相对的,而是说asar档案如何运作。
child_process.spawn()
只是调用系统API,您的系统无法从app.asar
内部执行文件。Python也不知道如何从那里执行代码。将其置于asar之外的一些解决方案:
extraResources
把这个放在你的电子构建器配置中(假设是json):
不要在
files
中再次打包它,没有理由。这样,您的src/py
就被复制到electron-builder构建中的resources/src/py
中。你也可以把它放在一个不同的目录下,像这样:
extraFiles
这与
extraResources
的工作原理相同,不同的是它被放在电子二进制文件旁边,而不是resources
子目录。asarUnpack
你可以像往常一样将你的python代码打包到asar中,就像在
files
中指定的那样,并使用asarUnpack
将一个解包的副本放在resources/app.asar.unpacked
中,就像这样:我不推荐这种方式,因为这样你的应用程序包含了两个python代码的副本:一个在asar内部(不被任何东西使用),另一个在
app.asar.unpacked
中