问题
py中引入了fcntl,import fcntl。当在windows系统下运行该py时,报错“ModuleNotFoundError: No module named ‘fcntl’”。
原因
fcntl为python标准库中的一个模块,属于Unix Specific,负责操作文件锁(https://docs.python.org/3/library/fcntl.html)。当使用python进行写文件时,如果多个进程同时写同一个文件,那么可能会存在问题,fcntl就是用来避免这个问题,使用系统锁的机制来保证同时只有一个进程写文件。很显然,这个模块是为linux系统准备,windows python中是不自带的,所以当我们在windows中运行使用了fcntl模块的py时,就会报错,模块无法找到。
解决办法
由于一般我们的项目都是直接放到linux环境下去跑的,所以不牵扯问题。但我们日常开发都会在windows ide中去跑。我们可能并不需要在windows下实现文件锁,所以这里我们只需要保证能够正常加载fcntl模块即可。这里通过mock一个假的fcntl.py放到python库中即可。
1、创建fcntl.py
fcntl.py代码如下
def fcntl(fd, op, arg=0):
return 0
def ioctl(fd, op, arg=0, mutable_flag=True):
if mutable_flag:
return 0
else:
return ""
def flock(fd, op):
return
def lockf(fd, operation, length=0, start=0, whence=0):
return
2、将fcntl.py 放入Python Lib中
“D:\software\miniconda\envs\maxkb” 为我虚拟环境的安装路径,将fcntl.py放入其中Lib目录下即可。再次运行py无误。
说明:Lib为python的默认标准库,在运行py时会被加载。
(maxkb) PS D:\github_codes\MaxKB> python -m site
sys.path = [
'D:\\github_codes\\MaxKB',
'D:\\software\\miniconda\\envs\\maxkb\\python311.zip',
'D:\\software\\miniconda\\envs\\maxkb\\Lib',
'D:\\software\\miniconda\\envs\\maxkb\\DLLs',
'D:\\software\\miniconda\\envs\\maxkb',
'D:\\software\\miniconda\\envs\\maxkb\\Lib\\site-packages',
]
USER_BASE: 'C:\\Users\\hansh\\AppData\\Roaming\\Python' (doesn't exist)
USER_SITE: 'C:\\Users\\hansh\\AppData\\Roaming\\Python\\Python311\\site-packages' (doesn't exist)
ENABLE_USER_SITE: True
(maxkb) PS D:\github_codes\MaxKB>