python - PyInstaller:使用子进程启动另一个Python进程

标签 python subprocess pyinstaller

如何从 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/

相关文章:

python - 有没有更好的方法在 Python 中编写连续的 "or"语句?

python 根据内部元素和忽略大小写对列表列表进行排序

python - 在单独的线程中从 python 启动 csh 脚本

python - pyinstaller:无法加载配置文件

python - Pyinstaller 未构建,因为 USS.jtx 的权限被拒绝

python - Pyinstaller 给出错误 ("Error loading Python ... no suitable image found")

python - Databricks - 在 Python 中创建函数 (UDF)

python - 带有短命令的间歇性 "OSError: [Errno 7] Argument list too long"(~125 个字符)

python:执行subprocess.popen时出错

python - 如何删除 Tkinter Python 应用程序中的视频?