冻结后使用 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 的同步链?
如何在不冻结 UI 的情况下使用 QProcess 循环的输出更新 UI?