From 1d95975cbec1480f0b3ba71c2583ef9a643a706c Mon Sep 17 00:00:00 2001 From: MoonRaker Date: Sun, 27 Sep 2015 08:32:51 -0700 Subject: [PATCH 1/4] Fix: NCSS netcdf temp file Permission Error on Windows --- siphon/ncss.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/siphon/ncss.py b/siphon/ncss.py index f29caab59..b266b8ebe 100644 --- a/siphon/ncss.py +++ b/siphon/ncss.py @@ -2,6 +2,8 @@ from io import BytesIO import numpy as np +from os import remove +import atexit from .http_util import DataQuery, HTTPEndPoint, parse_iso_date from .ncss_dataset import NCSSDataset @@ -341,15 +343,29 @@ def parse_xml_dataset(elem, handle_units): @response_handlers.register('application/x-netcdf') @response_handlers.register('application/x-netcdf4') def read_netcdf(data, handle_units): # pylint:disable=unused-argument - with NamedTemporaryFile() as tmp_file: + with NamedTemporaryFile(delete=False) as tmp_file: tmp_file.write(data) tmp_file.flush() + # return Dataset(tmp_file.name, 'r') + + ## Windows work around - DGG 9.14.2015 + atexit.register(deletetempfile,tmp_file.name) return Dataset(tmp_file.name, 'r') + except ImportError: import warnings warnings.warn('netCDF4 module not installed. ' 'Will be unable to handle NetCDF returns from NCSS.') +def deletetempfile(fname): + try: + remove(fname) + except PermissionError: + import warnings + warnings.warn('temporary netcdf dataset file not deleted. ' + 'to delete temporary dataset file in the future ' + 'be sure to use dataset.close() when finished.') + # Parsing of CSV data returned from NCSS @response_handlers.register('text/plain') From b37ae22eacd3bd50f7cd6f7af34f7a78dbc82526 Mon Sep 17 00:00:00 2001 From: MoonRaker Date: Fri, 16 Oct 2015 15:53:20 -0700 Subject: [PATCH 2/4] Modified get_data temp file handling for Windows OS --- siphon/ncss.py | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/siphon/ncss.py b/siphon/ncss.py index b266b8ebe..d57f908cb 100644 --- a/siphon/ncss.py +++ b/siphon/ncss.py @@ -2,7 +2,8 @@ from io import BytesIO import numpy as np -from os import remove +import os +import platform import atexit from .http_util import DataQuery, HTTPEndPoint, parse_iso_date @@ -343,14 +344,29 @@ def parse_xml_dataset(elem, handle_units): @response_handlers.register('application/x-netcdf') @response_handlers.register('application/x-netcdf4') def read_netcdf(data, handle_units): # pylint:disable=unused-argument - with NamedTemporaryFile(delete=False) as tmp_file: - tmp_file.write(data) - tmp_file.flush() - # return Dataset(tmp_file.name, 'r') + osType = platform.architecture() + if osType[1].lower() == 'windowspe': + with NamedTemporaryFile(delete=False) as tmp_file: + tmp_file.write(data) + tmp_file.flush() + atexit.register(deletetempfile,tmp_file.name) + return Dataset(tmp_file.name, 'r') + else: + with NamedTemporaryFile() as tmp_file: + tmp_file.write(data) + tmp_file.flush() + return Dataset(tmp_file.name, 'r') + +# def temp_opener(name, flag, mode=0o777): +# return os.open(name, flag | os.O_TEMPORARY, mode) + +# with tempfile.NamedTemporaryFile() as f: +# f.write(DATA) +# f.flush() +# with open(f.name, "rb", opener=temp_opener) as f: +# assert f.read() == DATA - ## Windows work around - DGG 9.14.2015 - atexit.register(deletetempfile,tmp_file.name) - return Dataset(tmp_file.name, 'r') +# assert not os.path.exists(f.name) except ImportError: import warnings @@ -359,7 +375,7 @@ def read_netcdf(data, handle_units): # pylint:disable=unused-argument def deletetempfile(fname): try: - remove(fname) + os.remove(fname) except PermissionError: import warnings warnings.warn('temporary netcdf dataset file not deleted. ' From e60e1f89c36c907246331b5ead387a759129c419 Mon Sep 17 00:00:00 2001 From: MoonRaker Date: Fri, 16 Oct 2015 16:56:21 -0700 Subject: [PATCH 3/4] Fixed syntax in imports and get_data --- siphon/ncss.py | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/siphon/ncss.py b/siphon/ncss.py index d57f908cb..9685a06f2 100644 --- a/siphon/ncss.py +++ b/siphon/ncss.py @@ -1,10 +1,10 @@ import xml.etree.ElementTree as ET +import atexit from io import BytesIO +from os import remove +import platform import numpy as np -import os -import platform -import atexit from .http_util import DataQuery, HTTPEndPoint, parse_iso_date from .ncss_dataset import NCSSDataset @@ -357,17 +357,6 @@ def read_netcdf(data, handle_units): # pylint:disable=unused-argument tmp_file.flush() return Dataset(tmp_file.name, 'r') -# def temp_opener(name, flag, mode=0o777): -# return os.open(name, flag | os.O_TEMPORARY, mode) - -# with tempfile.NamedTemporaryFile() as f: -# f.write(DATA) -# f.flush() -# with open(f.name, "rb", opener=temp_opener) as f: -# assert f.read() == DATA - -# assert not os.path.exists(f.name) - except ImportError: import warnings warnings.warn('netCDF4 module not installed. ' @@ -375,7 +364,7 @@ def read_netcdf(data, handle_units): # pylint:disable=unused-argument def deletetempfile(fname): try: - os.remove(fname) + remove(fname) except PermissionError: import warnings warnings.warn('temporary netcdf dataset file not deleted. ' From ba21c6782db1f18ecc302fefb5e622f89c88e903 Mon Sep 17 00:00:00 2001 From: MoonRaker Date: Mon, 19 Oct 2015 13:26:15 -0700 Subject: [PATCH 4/4] Fixed PEP8 syntax issues in NCSS.py --- siphon/ncss.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/siphon/ncss.py b/siphon/ncss.py index 9685a06f2..2cc27654c 100644 --- a/siphon/ncss.py +++ b/siphon/ncss.py @@ -344,12 +344,12 @@ def parse_xml_dataset(elem, handle_units): @response_handlers.register('application/x-netcdf') @response_handlers.register('application/x-netcdf4') def read_netcdf(data, handle_units): # pylint:disable=unused-argument - osType = platform.architecture() - if osType[1].lower() == 'windowspe': + ostype = platform.architecture() + if ostype[1].lower() == 'windowspe': with NamedTemporaryFile(delete=False) as tmp_file: tmp_file.write(data) tmp_file.flush() - atexit.register(deletetempfile,tmp_file.name) + atexit.register(deletetempfile, tmp_file.name) return Dataset(tmp_file.name, 'r') else: with NamedTemporaryFile() as tmp_file: @@ -362,10 +362,11 @@ def read_netcdf(data, handle_units): # pylint:disable=unused-argument warnings.warn('netCDF4 module not installed. ' 'Will be unable to handle NetCDF returns from NCSS.') + def deletetempfile(fname): try: remove(fname) - except PermissionError: + except OSError: import warnings warnings.warn('temporary netcdf dataset file not deleted. ' 'to delete temporary dataset file in the future '