为何os.path系列函数无法识别Ubuntu下的/dev/ttyUSB0设备文件?
问题
在Ubuntu 22.04系统(Python 3.10环境)下编写了检测UART类型USB设备是否连接的脚本:
import os path = os.path.join('dev', 'ttyUSB0') print(f'DBG exists: {os.path.exists(path)}') print(f'DBG isfile: {os.path.isfile(path)}') print(f'DBG isdir : {os.path.isdir(path)}') # print(f'DBG isdevdrive: {os.path.isdevdrive(path)}') # causes: AttributeError: module 'posixpath' has no attribute 'isjunction' print(f'DBG islink: {os.path.islink(path)}') # print(f'DBG isjunction: {os.path.isjunction(path)}') # causes: ditto print(f'DBG lexists: {os.path.lexists(path)}')
脚本输出:
DBG exists: False DBG isfile: False DBG isdir : False DBG islink: False DBG lexists: False
但通过命令行执行ls -al /dev/ttyUSB0可确认设备文件存在:
$ ls -al /dev/ttyUSB0 crw-rw----+ 1 root dialout 188, 0 Sep 25 10:42 /dev/ttyUSB0
疑问:为何os.path系列函数始终返回False?
原因分析与解决方法
- 路径错误是核心原因:脚本中
os.path.join('dev', 'ttyUSB0')生成的是相对路径dev/ttyUSB0,而非系统中真实存在的绝对路径/dev/ttyUSB0。Python会以当前脚本的执行目录为基准查找该相对路径,自然找不到目标设备文件。 - 设备文件类型特性:
/dev/ttyUSB0是字符设备文件(权限位开头的c标识),os.path.isfile()会返回False,因为该函数仅判断是否为普通文件。但只要路径正确,os.path.exists()会返回True,因为exists()能识别设备文件、目录、符号链接等各类文件系统对象。 - 平台专属API错误:
os.path.isdevdrive()和os.path.isjunction()是Windows平台特有的API,Linux系统下不存在,调用会抛出AttributeError,这与设备文件本身无关。
解决方法:将路径改为绝对路径即可,修改后的代码示例:
import os path = '/dev/ttyUSB0' # 直接使用绝对路径,也可以用os.path.join('/dev', 'ttyUSB0') print(f'DBG exists: {os.path.exists(path)}') print(f'DBG isfile: {os.path.isfile(path)}') # 仍返回False,因是字符设备 print(f'DBG isdir : {os.path.isdir(path)}') print(f'DBG islink: {os.path.islink(path)}') print(f'DBG lexists: {os.path.lexists(path)}')
内容的提问来源于stack exchange,提问作者JohnA
相关产品推荐
相关产品推荐

