为啥我会收到错误:无法在 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 行,在 Ui_Class, _ = loadUiType(ui_file_path) TypeError: 'NoneType' object is not subscriptable @ProfP30 1) 不要使用全局变量,2) *Now it failed here: line 17 * 是什么意思?你必须指出完整的错误信息 在此处查看完整的重写代码:pastebin.com/pZtyY5Uc 第 17 行,在 Ui_Class, _ = loadUiType(ui_file_path) TypeError: 'NoneType' object is not subscriptable 在此处查看错误(屏幕截图):pasteboard.co/Jq1SpU4.jpg @ProfP30 将此代码 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'

为啥我会收到此语法错误? (Python)

不支持请求方法“GET”。为啥我会收到此错误?

谁能向我解释为啥我会收到 Stack Overflow 错误?