gpt4 book ai didi

python - 如何添加 QProcess PATH 环境变量的路径? (Python 3.7 上的 PyQt5)

转载 作者:行者123 更新时间:2023-12-01 01:25:06 48 4
gpt4 key购买 nike

1。问题解释

我在应用程序显示其主窗口之前实例化一个QProcess()对象。 QProcess() 实例存储在 self.__myProcess 变量中,只要您可以看到主窗口,它就保持事件状态。

主窗口如下所示:

enter image description here

当您单击该按钮时,将执行以下代码:

def __btn_clicked(self):
self.__add_openocd_to_env()
command = "openocd.exe" + '\r\n'
self.__myProcess.start(command)

最后两行非常清楚:命令openocd.exe被传递给self.__myProcess并执行。 此可执行文件实际执行的操作在这里并不重要。事实上,我可以使用任何随机可执行文件。要点是:如果可执行文件位于我的 Windows PATH 环境变量中,它就会被找到并执行。

假设可执行文件不在 PATH 环境变量中。那么函数 self.__add_openocd_to_env() 应该可以解决这个问题:

def __add_openocd_to_env(self):
env = self.__myProcess.processEnvironment()
env.insert("PATH", "C:\\Users\\Kristof\\programs\\openocd_0.10.0\\bin;" + env.value("PATH"))
self.__myProcess.setProcessEnvironment(env)

但是,我发现它根本没有效果。我在这个函数中尝试了很多不同的东西,但它只是没有任何效果。

 
您可以在这里找到完整的代码:
如果您安装了 PyQt5 的 Python 3,您只需将代码复制粘贴到 .py 模块中并运行它。您应该看到带有按钮的小窗口。当然,您应该将路径“C:\Users\Kristof..”更改为您计算机上有效的路径。您可以为此测试选择任何您喜欢的可执行文件。

import sys
import os
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class CustomMainWindow(QMainWindow):
def __init__(self):
super(CustomMainWindow, self).__init__()
# -------------------------------- #
# QProcess() setup #
# -------------------------------- #
self.__myProcess = QProcess()
self.__myProcess.setProcessChannelMode(QProcess.MergedChannels)
self.__myProcess.readyRead.connect(self.__on_output)
self.__myProcess.errorOccurred.connect(self.__on_error)
self.__myProcess.finished.connect(self.__on_exit)

# -------------------------------- #
# Window setup #
# -------------------------------- #
self.setGeometry(100, 100, 800, 200)
self.setWindowTitle("QProcess test")

self.__frm = QFrame(self)
self.__frm.setStyleSheet("QWidget { background-color: #ffffff }")
self.__lyt = QVBoxLayout()
self.__lyt.setAlignment(Qt.AlignTop)
self.__frm.setLayout(self.__lyt)
self.setCentralWidget(self.__frm)

self.__myBtn = QPushButton("START QPROCESS()")
self.__myBtn.clicked.connect(self.__btn_clicked)
self.__myBtn.setFixedHeight(70)
self.__myBtn.setFixedWidth(200)
self.__lyt.addWidget(self.__myBtn)
self.show()

def __add_openocd_to_env(self):
env = self.__myProcess.processEnvironment()
env.insert("PATH", "C:\\Users\\Kristof\\programs\\openocd_0.10.0\\bin;" + env.value("PATH"))
self.__myProcess.setProcessEnvironment(env)

def __btn_clicked(self):
self.__add_openocd_to_env()
command = "openocd.exe" + '\r\n'
self.__myProcess.start(command)

def __on_output(self):
data = bytes(self.__myProcess.readAll()).decode().replace('\r\n', '\n')
print(data)

def __on_error(self, error):
print("")
print("Process error: {0}".format(str(error)))
print("")


def __on_exit(self, exitCode, exitStatus):
print("")
print("ExitCode = {0}".format(str(exitCode)))
print("ExitStatus = {0}".format(str(exitStatus)))
print("")


if __name__ == '__main__':
app = QApplication(sys.argv)
QApplication.setStyle(QStyleFactory.create('Fusion'))
myGUI = CustomMainWindow()
sys.exit(app.exec_())

 

2。我的问题

我知道在实例化 QProcess() 之前,我可以简单地将“C:\Users\Kristof\programs\openocd_0.10.0\bin”添加到我的 Windows PATH 环境变量中>。但这不是重点。我想知道如何将其添加到该特定 QProcess() 实例的 PATH 环境变量中。如果可能的话,它不应影响我的软件中的任何其他 QProcess() 实例,也不应影响我以后创建的任何 future QProcess() 实例。

3。系统设置

我在 Windows 10 上使用 Python 3.7 中的 PyQt5 框架。

<小时/>

注意:
我刚刚尝试通过以下方式改进 QProcess() 设置:

        # -------------------------------- #
# QProcess() setup #
# -------------------------------- #
self.__myProcess = QProcess()
self.__myProcess.setProcessChannelMode(QProcess.MergedChannels)
self.__myProcess.readyRead.connect(self.__on_output)
self.__myProcess.errorOccurred.connect(self.__on_error)
self.__myProcess.finished.connect(self.__on_exit)

# NEW: initialize the environment variables for self.__myProcess:
env = QProcessEnvironment.systemEnvironment()
self.__myProcess.setProcessEnvironment(env)

我满怀希望......但它仍然行不通:-(

最佳答案

根据@JonBrave先生的评论,我编写了以下解决方法:

import sys
import os
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class CustomMainWindow(QMainWindow):
def __init__(self):
super(CustomMainWindow, self).__init__()
# -------------------------------- #
# QProcess() setup #
# -------------------------------- #
self.__myProcess = QProcess()
self.__myProcess.setProcessChannelMode(QProcess.MergedChannels)
self.__myProcess.readyRead.connect(self.__on_output)
self.__myProcess.errorOccurred.connect(self.__on_error)
self.__myProcess.finished.connect(self.__on_exit)

# -------------------------------- #
# Window setup #
# -------------------------------- #
self.setGeometry(100, 100, 800, 200)
self.setWindowTitle("QProcess test")

self.__frm = QFrame(self)
self.__frm.setStyleSheet("QWidget { background-color: #ffffff }")
self.__lyt = QVBoxLayout()
self.__lyt.setAlignment(Qt.AlignTop)
self.__frm.setLayout(self.__lyt)
self.setCentralWidget(self.__frm)

self.__myBtn = QPushButton("START QPROCESS()")
self.__myBtn.clicked.connect(self.__btn_clicked)
self.__myBtn.setFixedHeight(70)
self.__myBtn.setFixedWidth(200)
self.__lyt.addWidget(self.__myBtn)
self.show()

def __add_openocd_to_env(self):
self.__oldEnv = os.environ["PATH"]
os.environ["PATH"] = "C:\\Users\\Kristof\\Dropbox (Personal)\\EMBEDOFFICE\\embedoffice\\resources\\programs\\openocd_0.10.0_dev00459\\bin;" + self.__oldEnv

def __remove_openocd_from_env(self):
os.environ["PATH"] = self.__oldEnv

def __btn_clicked(self):
self.__add_openocd_to_env()
command = "openocd.exe" + '\r\n'
self.__myProcess.start(command)
self.__myProcess.waitForStarted(-1)
self.__remove_openocd_from_env()

def __on_output(self):
data = bytes(self.__myProcess.readAll()).decode().replace('\r\n', '\n')
print(data)

def __on_error(self, error):
print("")
print("Process error: {0}".format(str(error)))
print("")

def __on_exit(self, exitCode, exitStatus):
print("")
print("ExitCode = {0}".format(str(exitCode)))
print("ExitStatus = {0}".format(str(exitStatus)))
print("")

if __name__ == '__main__':
app = QApplication(sys.argv)
QApplication.setStyle(QStyleFactory.create('Fusion'))
myGUI = CustomMainWindow()
sys.exit(app.exec_())

基本上我正在执行以下操作:在命令 QProcess() 实例启动命令之前,我将可执行路径添加到 PATH 环境变量中属于整个Python session 。命令启动后,我可以再次删除它,这样它就不会影响将来创建的其他 QProcess() 实例。

它确实有效,但如果我要在我的软件中应用这种方法,它肯定需要大量的“簿记”(许多 QProcess() 实例存在于我的软件中)。如果您发现更好的方法,请随时分享!

关于python - 如何添加 QProcess PATH 环境变量的路径? (Python 3.7 上的 PyQt5),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53438065/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com