冻结后使用 QProcess 运行 Python 脚本

Posted

技术标签:

【中文标题】冻结后使用 QProcess 运行 Python 脚本【英文标题】:Running Python script with QProcess after freeze 【发布时间】:2021-07-06 17:12:11 【问题描述】:

我正在使用 PyQt5 并使用 fbs 冻结应用程序。 该应用程序允许用户运行 Python 脚本。然后我将脚本保存在 Python 文件中并运行 QProcess 来运行该文件。

将要运行的脚本由用户编写。 我希望能够运行导入特定库(如 NumPy)的脚本,而无需用户自己安装库。

如何从我冻结的 Python 环境中运行 QProcess?这样用户就不必安装任何东西来运行我的应用程序以外的脚本。

现在,冻结后,QProcess 使用机器上安装的默认 Python 环境。

【问题讨论】:

【参考方案1】:

你不能,因为你总是需要:

解释器(即 Python)和

库的依赖关系(例如numpy需要一些dll)。

他们在另一个答案中提出的建议只有在您安装了解释脚本的 python 时才可行。

【讨论】:

但是 pyinstaller 将 python 运行时打包并冻结为可执行文件。我的问题是如何访问该打包环境 @T.J.我了解您有 2 个应用程序:一个使用 Qt (QProcess) 的脚本和一个通过 QProcess 启动的第二个脚本。所以如果你不希望两个脚本都依赖python,你必须将两个脚本都转换成.exe 所以没有办法复用打包好的python环境? @T.J.不是所有的python都被打包,只有必要的,只有.exe的依赖项 @eyllanesc 嗨,我有类似的问题,我可以通过设置 QProcessEnvironment 来解决吗?【参考方案2】:

您可以使用importlib.machinery.SourceFileLoader在您的应用中导入用户脚本

user_script.py

import numpy as np
print("hello from user_script.py")
print(np.zeros(1))

app.py

from importlib.machinery import SourceFileLoader
def load_user_script(path):
    SourceFileLoader("user_module", path).load_module()

要在单独的线程中运行,请使用QThread

from importlib.machinery import SourceFileLoader
from PyQt5 import QtCore

class Worker(QtCore.QThread):
    def __init__(self, path, parent = None):
        super().__init__(parent)
        self._path = path
    def run(self):
        SourceFileLoader("user_module", self._path).load_module()

worker = Worker(path)
worker.start()

【讨论】:

我不确定这是否适合我。我正在运行 QProcess Python 命令。我想使用我使用 fbs freeze 打包的 Python 环境。如果用户根本没有安装 Python 怎么办?我仍然希望他们能够运行 当你冻结你的应用程序时,你本质上是在 python 解释器和包中构建的,所以用户肯定会拥有 python。 当我运行 user_script.py 时,我使用命令 python 和脚本的绝对路径通过 QProcess 运行它。您能否解释一下将用户脚本导入我的应用程序有何帮助?我的目标是在我已经安装并冻结在我的应用程序中的 user_script 中使用 numpy。 如果您使用QProcess 运行它,您将无法访问冻结的包,但您不必以这种方式运行它,而是可以将用户脚本导入您的应用程序,这样所有冻结的包都可以访问(使用导入)给用户。 如何在没有 QProcess 的情况下在后台线程中运行它?我不希望脚本在我的应用程序中运行

以上是关于冻结后使用 QProcess 运行 Python 脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何在不冻结 gui 的情况下运行 QProcess 的同步链?

QProcess 冻结图形用户界面

如何在不冻结 UI 的情况下使用 QProcess 循环的输出更新 UI?

如何在不冻结 UI 的情况下使用 QProcess 循环的输出更新 UI?

如何读取 QProcess 输出

如何使用 QProcess 同时运行多个 python 脚本