Pyinstaller - 如何在可执行文件中从node.js子进程调用python?

0 人关注

我开发了一个应用程序,我想把它转换成Windows上的可执行文件(.exe)。它使用一个基于Python的后端(Python 3.9)和一个node.js/react前端。在我的conda环境中运行该程序,可以很好地实现预期效果。对于向可执行文件的转换,我使用了带有onedir选项的pyinstaller,并定义了一个相应的.spec文件。转换本身是可行的,但在启动.exe文件时出现了以下错误。

> reactcomponentsapp@0.1.0 backend C:\Users\myuser\PycharmProjects\app_frontend\dist\start_app
[1] > set FLASK_ENV=development && set FLASK_DEBUG=True && python run.py
[1] Python konnte nicht gefunden werden. F�hren Sie die Verkn�pfung ohne Argumente aus, um sie �ber den Microsoft Store zu installieren, oder deaktivieren Sie diese Verkn�pfung unter npm ERR! code ELIFECYCLE
[1] npm ERR! errno 9009
[1] npm ERR! reactcomponentsapp@0.1.0 backend: `set FLASK_ENV=development && set FLASK_DEBUG=True && python run.py`
[1] npm ERR! Exit status 9009
[1] npm ERR!
[1] npm ERR! Failed at the reactcomponentsapp@0.1.0 backend script.
[1] npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
[1] npm ERR! A complete log of this run can be found in:
[1] npm ERR!     C:\Users\myuser\AppData\Roaming\npm-cache\_logs\2022-07-19T08_16_57_264Z-debug.log
[1] npm run backend exited with code 9009
[0] i 「wds」: Project is running at http://10.145.133.56/
[0] i 「wds」: webpack output is served from

Pyinstaller转换python文件start_app.py,调用子进程,执行以下几行。

import subprocess
if __name__=='__main__':
    command = "npm run start"
    subprocess.run(command, shell=True)

替换代码3】命令被定义在package.json文件的脚本部分,它看起来如下。

"name": "reactcomponentsapp", "version": "0.1.0", "private": true, "dependencies": {... "scripts": { "start": "concurrently \"set PORT=8000 && react-scripts start\" \"npm run backend\"", "backend": "set FLASK_ENV=development && set FLASK_DEBUG=True && python run.py", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" },...

run.py创建一个Flask应用程序。

from backend import create_app    
if __name__ == '__main__':
        app = create_app()
        app.run(host='0.0.0.0',
                port=app.config['PORT'],
                threaded=True,

with backend.__init:

from flask import Flask
from flask_cors import CORS
app = None
def create_app():
    global app
    if not app:
        app = Flask(__name__)
        app.config.from_object('config')
        app.static_folder = app.config.get('STATIC_FOLDER')
    from . import views
    CORS(app)
    return app

最后,python脚本,在一个子进程中调用npm,这个子进程再次调用python。 由于sys.executable被设置为start_app.exe的路径,并且不存在任何python可执行文件,所以找不到python。将python run.py替换为我的conda环境中的python可执行文件的路径就可以了。然而,这显然不是一种选择,因为可执行文件应该在不安装python的情况下分发。

我能否以某种方式设置一个正确的Python变量/正确调用它?

Edit:

Output of the log:

0 info it worked if it ends with ok
1 verbose cli [
1 verbose cli   'C:\\Program Files\\nodejs\\node.exe',
1 verbose cli   'C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js',
1 verbose cli   'run',
1 verbose cli   'backend'
1 verbose cli ]
2 info using npm@6.14.14
3 info using node@v14.17.5
4 verbose run-script [ 'prebackend', 'backend', 'postbackend' ]
5 info lifecycle reactcomponentsapp@0.1.0~prebackend: reactcomponentsapp@0.1.0
6 info lifecycle reactcomponentsapp@0.1.0~backend: reactcomponentsapp@0.1.0
7 verbose lifecycle reactcomponentsapp@0.1.0~backend: unsafe-perm in lifecycle true
8 verbose lifecycle reactcomponentsapp@0.1.0~backend: PATH: C:\Program Files\nodejs\node_modules\npm\node_modules\npm-lifecycle\node-gyp-bin;C:\Users\myuser\PycharmProjects\app_frontend\dist\start_app\node_modules\.bin;C:\Program Files\nodejs\node_modules\npm\node_modules\npm-lifecycle\node-gyp-bin;C:\Users\myuserPycharmProjects\app_frontend\dist\start_app\node_modules\.bin;C:\Users\myuser\Anaconda3\condabin;C:\Program Files\Eclipse Adoptium\jdk-8.0.312.7-hotspot\bin;C:\Program Files (x86)\RSA SecurID Token Common;C:\Program Files\RSA SecurID Token Common;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\Sennheiser\SoftphoneSDK\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\Program Files\Microsoft SQL Server\130\DTS\Binn\;C:\Program Files (x86)\CaseWare IDEA\IDEA\Lib\site-packages\pypiwin32_system32;C:\Program Files\CaseWare IDEA\IDEA;C:\Program Files (x86)\CaseWare IDEA\IDEA;C:\Program Files\nodejs\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Users\myuser\AppData\Local\Microsoft\WindowsApps;C:\Users\myuser\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\myuser\AppData\Local\Programs\Git\cmd;C:\Users\myuser\AppData\Roaming\npm;C:\Users\myuser\AppData\Local\Programs\Azure Data Studio\bin;
9 verbose lifecycle reactcomponentsapp@0.1.0~backend: CWD: C:\Users\myuser\PycharmProjects\app_frontend\dist\start_app
10 silly lifecycle reactcomponentsapp@0.1.0~backend: Args: [
10 silly lifecycle   '/d /s /c',
10 silly lifecycle   'set FLASK_ENV=development && set FLASK_DEBUG=True && python run.py'
10 silly lifecycle ]
11 silly lifecycle reactcomponentsapp@0.1.0~backend: Returned: code: 9009  signal: null
12 info lifecycle reactcomponentsapp@0.1.0~backend: Failed to exec backend script
13 verbose stack Error: reactcomponentsapp@0.1.0 backend: `set FLASK_ENV=development && set FLASK_DEBUG=True && python run.py`
13 verbose stack Exit status 9009
13 verbose stack     at EventEmitter.<anonymous> (C:\Program Files\nodejs\node_modules\npm\node_modules\npm-lifecycle\index.js:332:16)
13 verbose stack     at EventEmitter.emit (events.js:400:28)
13 verbose stack     at ChildProcess.<anonymous> (C:\Program Files\nodejs\node_modules\npm\node_modules\npm-lifecycle\lib\spawn.js:55:14)
13 verbose stack     at ChildProcess.emit (events.js:400:28)
13 verbose stack     at maybeClose (internal/child_process.js:1055:16)
13 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:288:5)
14 verbose pkgid reactcomponentsapp@0.1.0
15 verbose cwd C:\Users\myuserPycharmProjects\app_frontend\dist\start_app
16 verbose Windows_NT 10.0.19042
17 verbose argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "run" "backend"
18 verbose node v14.17.5
19 verbose npm  v6.14.14
20 error code ELIFECYCLE
21 error errno 9009
22 error reactcomponentsapp@0.1.0 backend: `set FLASK_ENV=development && set FLASK_DEBUG=True && python run.py`