为啥我会收到错误:无法在 macOS Catalina 下运行 PySide2 程序的“uic”:“execvp:没有这样的文件或目录”?
Posted
技术标签:
【中文标题】为啥我会收到错误:无法在 macOS Catalina 下运行 PySide2 程序的“uic”:“execvp:没有这样的文件或目录”?【英文标题】:Why do I get the error: Cannot run 'uic': "execvp: No such file or directory" for a PySide2 program under macOS Catalina?为什么我会收到错误:无法在 macOS Catalina 下运行 PySide2 程序的“uic”:“execvp:没有这样的文件或目录”? 【发布时间】:2020-09-07 12:38:19 【问题描述】:我想执行一个使用 PyQt5 用 python 编写的程序,然后在 MacOS Catalina 下迁移到 PySide2。 使用 PyQt5,它执行得很好。 我已经像 PyQt5 一样安装了 PySide2:
python3 -m pip install PyQt5
python3 -m pip install PySide2
macOS 之后重新启动。
现在,安装 PySide2 后,当我尝试加载 Ui 文件时,我在 macOS 中遇到错误。
适用于 Linux、Windows 和 macOS Catalina 的 MRE:
#!/usr/bin/env python3
# Standard library imports
import sys
# Third party imports
from PySide2.QtCore import (QMetaObject,
Slot)
from PySide2.QtWidgets import (QApplication,
QWidget,
QPushButton,
QHBoxLayout,
QMessageBox)
def show_about():
msg = QMessageBox()
msg.setText("About this app.")
msg.setStandardButtons(QMessageBox.Ok)
msg.exec_()
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
aboutButton = QPushButton("About")
aboutButton.setObjectName("aboutButton")
hbox = QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(aboutButton)
self.setLayout(hbox)
QMetaObject.connectSlotsByName(self)
self.setWindowTitle('Buttons')
@Slot()
def on_aboutButton_clicked(self):
show_about()
def main():
app = QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
MRE 在 macOS Catalina 下失败,但在 Linux 和 Windows 下工作:
#!/usr/bin/env python3
# Standard library imports
import sys
# Third party imports
from PySide2.QtWidgets import (QApplication,
QMainWindow)
from PySide2.QtUiTools import loadUiType
class MainWindow(QMainWindow, loadUiType("win_main.ui")[0]):
def __init__(self):
super().__init__()
self.setupUi(self)
def main():
app = QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
错误:
Python 3.8.5 (/usr/local/bin/python3)
>>> %Run pyside2_win_main.py
Cannot run 'uic': "execvp: No such file or directory" - Exit status QProcess::NormalExit ( 255 )
Check if 'uic' is in PATH
Traceback (most recent call last):
File "/Users/dee/ownCloud3/rma2/pyside2_win_main.py", line 12, in <module>
class MainWindow(QMainWindow, loadUiType("win_main.ui")[0]):
TypeError: 'NoneType' object is not subscriptable
为了简化测试用例的文件结构:
/Users/dee/ownCloud3/rma2/pyside2_win_main.py
/Users/dee/ownCloud3/rma2/win_main.ui
PySide2 版本 15.5.0,shiboken2==5.15.0。
macOS Calatina v10.15.06
Python 3.8.5 64bit(从here下载,没有 HomeBrew 等。
【问题讨论】:
请提供minimal reproducible example mmm,文件“/Users/dee/ ownCloud3 /rma2/src.pyside2/win_main.py”和/Users/dee/rma2/ui/win_main.ui @eyllanesc:完成。用一个工作和失败的 MRE 更新了我的原始帖子。 【参考方案1】:不要使用相对路径,因为它们容易出错,因为这取决于脚本的运行方式,而是构建绝对路径:
import os.path
CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
ui_file_path = os.path.join(CURRENT_DIR, "win_main.ui")
Ui_Class, _ = loadUiType(ui_file_path)
class MainWindow(QMainWindow, Ui_Class):
# ...
还要在文件顶部添加,因为似乎在安装python时,没有标记向环境变量添加必要路径的选项:
import PySide2
import os.path
uic_dir = os.path.dirname(PySide2.__file__)
os.environ["PATH"] += os.pathsep + uic_dir
【讨论】:
按照您的建议对其进行了重新设计。 Ui_Class, _ = loadUiType(ui_file) class MainWindow(QMainWindow, Ui_Class): ... 现在在这里失败:第 17 行 -> Python 3.8.5 (/usr/local/bin/python3) >>> %Run pyside2_win_main.py无法运行“uic”:“execvp:没有这样的文件或目录”-退出状态 QProcess::NormalExit (255) 检查“uic”是否在 PATH Traceback 中(最后一次调用):文件“/Users/dee/ownCloud3/ rma2/pyside2_win_main.py",第 17 行,在import PySide2 import os.path uic_dir = os.path.dirname(PySide2.__file__) os.environ["PATH"] += os.pathsep + uic_dir
添加到您的填充物上以上是关于为啥我会收到错误:无法在 macOS Catalina 下运行 PySide2 程序的“uic”:“execvp:没有这样的文件或目录”?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我会收到“未捕获的类型错误:无法读取未定义的属性 'body'”?
为啥我会收到错误消息:“FileExistsError: [WinError 183] 当文件已存在时无法创建文件”?
为啥我会收到此错误? UnknownEndpoint:无法访问的主机:`devicefarm.us-east-1.amazonaws.com'