【问题标题】:Convert Windows UNC path to QUrl for Mac将 Windows UNC 路径转换为 ​​Mac 的 QUrl
【发布时间】:2020-02-05 16:37:01
【问题描述】:

背景:我有一个数据库,其中视频文件的路径存储为 Windows UNC 路径字符串,例如“\\11.22.33.44\path\movie.mp4”。 (Windows 格式是一个遗留的东西,我无法从根本上改变它们的存储方式)。

我现在正在使用 PyQt5 的 QMediaPlayer 开发 Python 媒体播放器。在 Windows 上,它运行良好,并且:

self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(str(fileName))))

在播放器中打开电影文件。

但是,也需要在 Mac 上进行这项工作,我在将 Windows UNC 路径转换为适用于 Mac 的 QUrl 格式时遇到了问题。我在网上尝试了各种os.pathpathlib 示例,但似乎没有一个可以创建QUrl.fromLocalFile 可以使用的有效路径。我总是打Error: Failed to load media。我得到像“/11.22.33.44/file/movie.mp4”这样的结果,开头有一个反斜杠和一个前斜杠,诸如此类。

我应该指出,是的,这些是网络路径,被发送到一个名为“fromLocalFile”的方法,但 QUrl 的文档确实声明它将与网络路径一起使用:https://doc.qt.io/qt-5/qurl.html#fromLocalFile- 所以我不认为应该是问题吗?

有人可以向我解释完成这项工作的正确方法吗?我认为 Pathlib 应该能够使用它,但我只是以错误的方式接近它。

(这个问题不是 Loading video using QMediaPlayer and UNC paths 的重复问题,因为我的代码在 Windows 上运行,而我在使用 Mac 友好路径时遇到了不同的问题。)

【问题讨论】:

  • 我不明白为什么用户会在 macOS 下使用 UNC 路径?远程服务器不会挂载在文件系统上吗?
  • @trojanfoe 感谢您的提问。在当前设置中,不能假设已经建立了服务器连接(涉及多个服务器,软件用户不一定连接到所有服务器)。即使可以假设安装,我目前也不知道如何将 UNC 转换为等效的“卷”路径。
  • 这就是我的意思;除了 Windows,不会有 UNC。所有 O/S 都有自己的方式来指定远程服务器路径等。
  • 好的,谢谢。我不习惯 Mac 以及它们的安装方式。如果我理解正确,您是说会有这么简单的路径解决方案,而需要一个涉及创建挂载点的更高级的解决方案?
  • 我不是 100% 说实话。正如 ekhumoro 的回答所示,它可能会改用 smb:// URL 方案。但是我认为他特定于平台的代码应该是编译时(即#ifdefs)而不是运行时。

标签: windows macos pyqt5 unc qurl


【解决方案1】:

我怀疑是否有一种完全可靠且可移植的方式来为任意网络路径执行此操作。但是,假设您的 Windows UNC 路径始终采用相同的格式,这样的事情应该可以工作:

import platform
from PyQt5.QtCore import QUrl

def make_url(unc):
    if platform.system() == 'Windows':
        url = QUrl.fromLocalFile(unc)
    else:
        url = QUrl(unc.replace('\\', '/'))
        if platform.system() == 'Darwin':
            url.setScheme('smb')
    return url

print(make_url(r'\\11.22.33.44\path\movie.mp4'))

如果这不起作用,请尝试:

def make_url(unc):
    if platform.system() != 'Windows':
        unc = unc.replace('\\', '/')
    return QUrl.fromLocalFile(unc)   

(注意:我在 Linux 上,所以我无法对此进行测试)。

【讨论】:

  • 感谢@ekhumoro 的建议。这感觉像是进步,但不幸的是,它还没有被证明是一个完整的解决方案。 QUrl 输出现在表示为smb://11.22.33.44/path/movie.mp4,在我看来比以前更好,但 QMediaPlayer 仍然显示Failed to load media。但是,如果我使用 QFileDialog 浏览到 MP4,则返回的文件名表示为 QUrl file:///11.22.33.44/path/movie.mp4 并且可以正常工作,但 samba 路径不是。 :-(
  • @TwentyPenguins 好的,在 file: 网址对您有用的基础上,我添加了一个更简单的解决方案。
  • 不幸的是我之前的评论是不正确的,我的错误。 file:///11.22.33.44/path/ 路径工作,但file:///Volumes/path/(安装的)路径,手动选择,工作工作。因此,尽管您的代码成功地形成了正确的路径(谢谢),但不幸的是,我仍然无法假设驱动器已安装,或者无法将基于 IP 的 UNC 转换为卷安装路径。
  • @TwentyPenguins 所以现在你的问题已经发生了很大的变化。这就是为什么 Qt 和 Python 不提供这种开箱即用的功能。您必须找到一种以编程方式从 IP 地址获取正确挂载点的方法。就目前而言,我认为您的问题无法真正回答。或者至少,我的回答是关于简单的路径/url 操作。
  • 谢谢。您当然是正确的,路径的形成是正确的,问题是关于挂载点和将 Samba 共享提供给 Mac 上的 QMediaPlayer 的不同问题。我将进一步调查,看看我是否可以提出一个明智的新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
  • 2011-01-19
  • 2017-02-19
  • 2011-02-15
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多