我开发了一个应用程序,我想把它转换成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`