summaryrefslogtreecommitdiff
path: root/grc/gui/external_editor.py
diff options
context:
space:
mode:
authorSebastian Koslowski <koslowski@kit.edu>2017-01-17 09:45:36 +0100
committerSebastian Koslowski <koslowski@kit.edu>2017-01-17 09:52:15 +0100
commit0002525abeff6f80e7deb35849f2fc47ce9982a4 (patch)
treebaa1172f8d3483ee4fabc5881db8614a168a4134 /grc/gui/external_editor.py
parent591369362b985ac721f1c7bd0ef4fea9b5c759d9 (diff)
grc: fix file monitor on windows (#1169)
I seems tempfile.NamedTemporaryFile() can not be used under windows, as keeping the fp around locks the file for writing. So, we close the the handle after the initial write and delete the file manually.
Diffstat (limited to 'grc/gui/external_editor.py')
-rw-r--r--grc/gui/external_editor.py28
1 files changed, 13 insertions, 15 deletions
diff --git a/grc/gui/external_editor.py b/grc/gui/external_editor.py
index 76f21412b0..010bd71d1a 100644
--- a/grc/gui/external_editor.py
+++ b/grc/gui/external_editor.py
@@ -34,18 +34,14 @@ class ExternalEditor(threading.Thread):
self.editor = editor
self.callback = callback
- self.tempfile = self._create_tempfile(name, value)
+ self.filename = self._create_tempfile(name, value)
def _create_tempfile(self, name, value):
- fp = tempfile.NamedTemporaryFile(mode='w', suffix='.py',
- prefix=name + '_')
- fp.write(value)
- fp.flush()
- return fp
-
- @property
- def filename(self):
- return self.tempfile.name
+ with tempfile.NamedTemporaryFile(
+ mode='wb', prefix=name + '_', suffix='.py', delete=False,
+ ) as fp:
+ fp.write(value.encode('utf-8'))
+ return fp.name
def open_editor(self):
proc = subprocess.Popen(args=(self.editor, self.filename))
@@ -65,16 +61,18 @@ class ExternalEditor(threading.Thread):
if mtime > last_change:
# print "file monitor: reload trigger for", filename
last_change = mtime
- with open(filename) as fp:
- data = fp.read()
+ with open(filename, 'rb') as fp:
+ data = fp.read().decode('utf-8')
self.callback(data)
time.sleep(1)
except Exception as e:
print >> sys.stderr, "file monitor crashed:", str(e)
- else:
- # print "file monitor: done with", filename
- pass
+ finally:
+ try:
+ os.remove(self.filename)
+ except OSError:
+ pass
if __name__ == '__main__':