在import mlogging 的时候,一直报错,网上几乎没有别的办法,发现是在导入 fcntl这个包的时候出了错,经过多番搜索发现 pip安装下来的mlogging这个包应该是在linux上运行的,见 https://github.com/kieslee/mlogging , 所以ffi一直找不到
所以想在windows系统上用这个包需要改写一下mlogging这个包
- 在site-packages中找到mlogging文件夹,打开编辑__init__.py文件
from logging import StreamHandler, FileHandler
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
import fcntl, time, os, codecs, string, re, types, cPickle, struct, shutil
from stat import ST_DEV, ST_INO, ST_MTIME
- 看到这里import了fcntl模块,它就是报错的根源
import fcntl
File "D:\Apps\PyCharm 2018.2.4\helpers\pydev\_pydev_bundle\pydev_import_hook.py", line 20, in do_import
module = self._system_import(name, *args, **kwargs)
File "D:\Apps\anaconda2.5.2.0\lib\site-packages\fcntl.py", line 1, in <module>
import ffi
File "D:\Apps\PyCharm 2018.2.4\helpers\pydev\_pydev_bundle\pydev_import_hook.py", line 20, in do_import
module = self._system_import(name, *args, **kwargs)
ImportError: No module named ffi
from logging import StreamHandler, FileHandler
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
import time, os, codecs, string, re, types, cPickle, struct, shutil
from stat import ST_DEV, ST_INO, ST_MTIME
import win32con, win32file, pywintypes
LOCK_EX = win32con.LOCKFILE_EXCLUSIVE_LOCK
LOCK_SH = 0 # the default
LOCK_NB = win32con.LOCKFILE_FAIL_IMMEDIATELY
__overlapped = pywintypes.OVERLAPPED( )
def lock(file, flags):
hfile = win32file._get_osfhandle(file.fileno( ))
win32file.LockFileEx(hfile, flags, 0, 0xffff0000, __overlapped)
def unlock(file):
hfile = win32file._get_osfhandle(file.fileno( ))
win32file.UnlockFileEx(hfile, 0, 0xffff0000, __overlapped)
- 编写lock, unlock 函数,来实现下面 fcntl 的功能,如:
fcntl.flock(f.fileno(), fcntl.LOCK_EX)
emit(self, record)
flock(f.fileno(), fcntl.LOCK_UN)
可更改为以下代码,来实现锁定文件
lock(f, LOCK_EX)
FileHandler_MP.emit(self, record)
unlock(f)
大功告成
在此要感谢同事的帮助,解决了困扰我大半天的问题。