Dropbox и Pyinotify
Вопрос
Я только что получил iPad, и я по глупости получил приложение Textouch. По глупости, потому что благодаря регулированию Apple Textouch не может компилировать Tex. Он синхронизирует файл .tex к компьютеру с помощью dropbox. На далеком компьютере он попадает в другой программе, которая компилирует файл .tex к pdf и отправляет его обратно. Но (сюрприз!) Эта далекая программа в Windows и Mac только. И я на Linux. Поэтому я подумал, почему бы не использовать Inotify? Чтобы сделать вещи немного проще, я на самом деле использовал Pyinotify, поэтому мне не придется иметь дело с тоннами компиляции. Но когда Dropbox падает файл, вот, в Pyinotify Vernacular, события, которые происходят. (Очевидно, что «первый doc.tex» - это имя файла, которое я сингируется.)
event: <Event dir=False mask=0x20 maskname=IN_OPEN name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x1 maskname=IN_ACCESS name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x10 maskname=IN_CLOSE_NOWRITE name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event cookie=151401 dir=False mask=0x40 maskname=IN_MOVED_FROM name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event cookie=151402 dir=False mask=0x80 maskname=IN_MOVED_TO name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x4 maskname=IN_ATTRIB name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x20 maskname=IN_OPEN name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x1 maskname=IN_ACCESS name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x10 maskname=IN_CLOSE_NOWRITE name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x20 maskname=IN_OPEN name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x1 maskname=IN_ACCESS name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x10 maskname=IN_CLOSE_NOWRITE name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x20 maskname=IN_OPEN name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x1 maskname=IN_ACCESS name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x10 maskname=IN_CLOSE_NOWRITE name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x20 maskname=IN_OPEN name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x1 maskname=IN_ACCESS name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x10 maskname=IN_CLOSE_NOWRITE name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
Что я могу сделать это? Единственные события, которые, кажется, являются уникальными, - это события in_move_from и in_move_to. Но это похоже на неудачу, чтобы контролировать их. Есть ли способ обнаружить событие, которое инициировано Dropbox? Должен ли я использовать что-то другое, чем inotify или pyinotify?
Решение
Хорошо, IN_OPEN
(файл, открытый для чтения), IN_ACCESS
(доступ к файлу) и IN_ATTRIB
(Изменение атрибутов файлов), очевидно, не то, что вам нужно. IN_CLOSE_NOWRITE
Значит, файл был закрыт для чтения (т. Е. Изменения не могли быть сделаны), так что это тоже не то, что вам нужно. Так что это должно быть либо IN_MOVED_FROM
или IN_MOVED_TO
Отказ Вы уверены, что нет других событий, происходящих вообще? Если вы есть, то файл, вероятно, создается где-то еще, а затем перемещается в его окончательное место в ~/Dropbox
.
Другие советы
У меня есть сценарий, работающий, который часы для In_Moved_to. Всякий раз, когда Dropbox опустится новый файл, он срабатывает. Вы должны использовать In_Moved_to.
<Event cookie=63896 dir=False mask=0x80 maskname=IN_MOVED_TO name=test.zip path=/home/bpotter/Dropbox/Apps/Backup pathname=/home/bpotter/Dropbox/Apps/Backup/test.zip wd=1 >