os.path.isfile() 为 linux smb 网络驱动器上的文件返回 false

Posted

技术标签:

【中文标题】os.path.isfile() 为 linux smb 网络驱动器上的文件返回 false【英文标题】:os.path.isfile() returns false for file on linux smb network drive 【发布时间】:2019-11-14 12:30:09 【问题描述】:

我的台式计算机运行的是 Linux Mint 19.1。另一台计算机正在运行 Linux Mint 18.3。两台计算机都运行 Samba。我正在尝试让我的桌面 python 代码检查另一台计算机上的文件。在 Caja 文件管理器中,它显示路径为“smb://lenovo2/kwpvr/”。我可以在 Caja 中复制、删除或重命名文件。

之前有人问过这个问题,但答案只针对其他操作系统 (Windows)。 os.path.isfile() returns false for file on network drive

#!/usr/bin/python3
import os
print(os.path.isfile("smb://lenovo2/kwpvr/kwpvr3.db"))  # False
print (os.path.isfile("//lenovo2/kwpvr/kwpvr3.db"))     # False
print (os.path.isfile("smb:\\lenovo2\kwpvr\kwpvr3.db")) # False
print (os.path.isfile("\\lenovo2\kwpvr\kwpvr3.db"))     # False

print (os.path.exists("smb://lenovo2/kwpvr/kwpvr3.db")) # False
print (os.path.exists("//lenovo2/kwpvr/kwpvr3.db"))     # False
print (os.path.exists("smb:\\lenovo2\kwpvr\kwpvr3.db")) # False
print (os.path.exists("\\lenovo2\kwpvr\kwpvr3.db"))     # False

os.path.exists() 对于我能想到的文件名的任何排列,总是返回 False。

【问题讨论】:

对于反斜杠不要忘记转义它们!例如。 "\\\\lenovo2\\kwpvr\\kwpvr3.db" 去过那里,做到了。同样的结果(我没有得到一件 T 恤)。 【参考方案1】:

os.path 仅适用于可以通过本地文件系统访问的文件。它不适用于 smb://https:// 等 URI。

如果你想通过 Linux 上的本地文件系统使网络共享上的文件可用,你必须挂载它们,例如:

mount -t cifs //host/myshare /mnt/mypath

然后使用os.path.exists("/mnt/mypath/hello.txt")

或者,使用 SMB/CIFS API 代替 os.path

【讨论】:

谢谢...。我想答案可能是这样的。不幸的是,它也比我想象的更复杂。

以上是关于os.path.isfile() 为 linux smb 网络驱动器上的文件返回 false的主要内容,如果未能解决你的问题,请参考以下文章

python中由于中文路径引起的os.path.isfile(imgpath) == False问题

python中os.path.isdir()和os.path.isfile()的正确用法

os.path.isfile 使用误区

在 python 中检查 os.path.isfile(filename) 是不是区分大小写

os.path.isfile的错误

Python --判断路径是否为目录或文件