相关文章推荐
腼腆的柠檬  ·  python ...·  2 周前    · 
有情有义的大白菜  ·  python ...·  2 周前    · 
完美的馒头  ·  python QTreeWidget ...·  2 周前    · 
失眠的烤红薯  ·  python qt textBrowser ...·  2 周前    · 
另类的滑板  ·  Supervisor ...·  1 年前    · 
重感情的草稿本  ·  javafx close ...·  1 年前    · 
冷冷的马铃薯  ·  基于 attention ...·  1 年前    · 

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

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

我怎样才能在我冻结的Python环境中运行QProcess?这样用户就不必安装任何东西来运行他们的脚本,而只需安装我的应用程序。

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

python
pyqt5
pyinstaller
qprocess
fbs
T.J.
T.J.
发布于 2021-07-07
2 个回答
eyllanesc
eyllanesc
发布于 2021-07-07
已采纳
0 人赞同

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

  • 解释器(也就是Python)和

  • 库的依赖性(例如,numpy需要一些dlls)。

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

  • T.J.
    但是 pyinstaller 将 python 运行时间打包并冻结在一个可执行文件中。我的问题是,我怎样才能访问这个打包的环境?
    @T.J. 我知道你有两个应用程序。一个使用Qt的脚本(QProcess)和另一个通过QProcess启动的脚本。因此,如果你不希望两个脚本都依赖python,你必须将两个脚本都转换为.exe格式
    T.J.
    所以没有办法重新使用打包的python环境?
    @T.J. 不是所有的Python都被打包了,而是只有必要的部分,只有.exe的依赖项。
    Alex
    @eyllanesc 你好,我有一个类似的问题,我可以通过设置QProcessEnvironment来实现吗?
    mugiseyebrows
    mugiseyebrows
    发布于 2021-07-07
    0 人赞同

    你可以在你的应用程序中使用 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):