Archive
Using cross-platform fswatch utility for monitoring file system changes
I was just looking for a way to monitor for file system changs in a cross-platform way.
After searching the answers at a related question on StackExchange and the ones at the other question mentioned as possible duplicate in that question’s comments, I think I’d go with fswatch since it is has cross-platform support. Contributed the following answer to collect info I gathered on fswatch.
It uses different kinds of monitors for different OS and can choose the appropriate one automatically, or allow one to specify which one to use and even pass custom platform-specific parameters to the respective monitor.
The list of monitors it currently supports is:
· A monitor based on the File System Events API of Apple OS X.
· A monitor based on kqueue, an event notification interface introduced in FreeBSD 4.1 and supported on most *BSD systems (including OS X).
· A monitor based on inotify, a Linux kernel subsystem that reports file system changes to applications.
· A monitor based on File Events Notification, a Solaris/Illumos kernel API that reports file events.
· A monitor based on ReadDirectoryChangesW, a Microsoft Windows API that reports changes to a directory.
· A monitor which periodically stats the file system, saves file modification times in memory and manually calculates file system changes, which can work on any operating system where stat (2) can be used.
It seems to be available via apt-get on Debian/Ubuntu Linuxes. See how to install via apt-get and use fswatch.
FreeBSD and OS-X package-based installation support for fswatch is provided by its author.
Can also build and install it at other OSes, found an article+video showing how to make and install fswatch on CentOS.
There is also an other article that shows the same manual process to build/install (and use) fswatch for Linux.
Windows-based package-based installation support doesn’t seem to be available yet (e.g. no package for Chocolatey yet, and no package for Vcpkg)
There is also extensive documentation for fswatch, though docs for the latest 1.5 version point to 1.4 ones currently. See how to convert commands for fswatch 0.x to fswatch 1.x
Tips for manually choosing a monitor (currently not updated to mention all monitors)
Read about fswatch usage here, here and here and a tutorial intro here
A library named libfswatch is kept in sync with the fswatch tool. See here and a newer doc here. Note that the library is versioned differently from fswatch utility itself. Specifically, the 1.14.0 library doc states:
"libtool’s versioning scheme is described by three integers: current:revision:age.
· current is the most recent interface number implemented by the library.
· revision is the implementation number of the current interface.
· age is the difference between the newest and the oldest interface that the library implements.
Beware that there is also another similar s/w called fswatch (that is go-related I think).
Python rstrip and whitespace
Was just reading
https://www.w3schools.com/python/ref_string_rstrip.asp
which says
The
rstrip()
method removes any trailing characters (characters at the end a string), space is the default trailing character to remove.
Notes:
1) the chars param was added at Python 2.2.3, can’t use it at older versions as noted at
https://docs.python.org/2.6/library/string.html
- string.rstrip(s[, chars])
- Return a copy of the string with trailing characters removed. If chars is omitted or None, whitespace characters are removed. If given and not None, chars must be a string; the characters in the string will be stripped from the end of the string this method is called on.
Changed in version 2.2.3: The chars parameter was added. The chars parameter cannot be passed in earlier 2.2 versions.
2) from the official doc and other docs too I read the default is to remove whitespace characters, not just the space char:
https://python-reference.readthedocs.io/en/latest/docs/str/rstrip.html
chars Optional. String specifying the set of characters to be removed. If omitted or None, the chars argument defaults to removing whitespace. The chars argument is not a prefix; rather, all combinations of its values are stripped.
Not sure what is considered whitespace in various Python versions though. At least in Python2 it wasn’t removing \r in both Solaris and MSYS2 (a POSIX environment on Windows) where I just tried.
For example, I was just debugging some program that was working in Python 3, but in Python 2 it was moving the cursor to the start of the line when printing a raw_input prompt with some string it had read before…
…the issue proved to be that it was opening a file with ‘r’ mode instead of ‘rU’ which is universal newlines mode – https://www.python.org/dev/peps/pep-0278/ – converts \r\n to \n – and it seems that rstrip was failing to remove the \r from the end of those strings.
In Python 3 it was either using the universal newlines mode by default and thus stripping the \r from strings while reading from the file, or the rstrip was removing \r too in Python3, but I guess it was the 1st case (didn’t do any more check since the universal newlines read file open mode fixed the issue in Python 2 for me).
Speaking of that, I wonder whether Python considers whitespace differently on Windows and on Unixes (aka having [l/r]strip commands remove \r on the 1st but not on the 2nd case), which would be an extra complexity when writing portable s/w.