如何从 PyInstaller 可执行文件中使用 subprocess
启动另一个 Python 进程?
也就是说,我有一个 Python 脚本,我使用 PyInstaller 将其编译为可执行文件。在这个 Python 脚本中,有时我需要使用 subprocess
启动另一个 Python 进程(我有充分的理由使用 subprocess
而不是 multiprocessing
在这里,即因为它似乎是在新控制台窗口中打开新进程的唯一方法(在 Windows 上使用 creationflags=CREATE_NEW_CONSOLE_WINDOW
):
subprocess.run([sys.executable, "-m", "some.module", ...])
但是这种方法不起作用,因为当 PyInstaller 编译的可执行文件运行时,sys.executable
不再是 Python 解释器的路径,而是可执行文件本身的路径。我也不想只使用“python”,因为我想确保它使用与运行主程序完全相同的 Python 解释器。
使用 subprocess
的另一个原因是,如果我找到一种通过如上所述显式调用解释器来启动 Python 进程的方法(使用参数列表 [sys.executable, .. .]
),我将能够使用子流程的异步版本 asyncio.subprocess
,它的 API 与 subprocess
非常相似。似乎没有相当于多处理
的asyncio。
最佳答案
您可以从本地安装中复制 python.exe
,然后将其用作 subprocess.run
的入口点。可执行文件应该可以看到 PyInstaller 执行的所有操作。
作为示例,此文件
import subprocess
import sys
from pathlib import Path
python_exe = Path(sys.executable).with_stem("python")
subprocess.run([str(python_exe), "-m", "__hello__"])
复制文件后按预期工作:
(.venv) PS dir> pyinstaller .\main.py
...
(.venv) PS dir> Copy-Item "$env:LOCALAPPDATA\Programs\Python\Python310\python.exe" "dist/main"
(.venv) PS dir> .\dist\main\main.exe
Hello world!
关于python - PyInstaller:使用子进程启动另一个Python进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72259830/