[fluiddyn] Re: fluiddyn Digest V1 #2

  • From: Ashwin Vishnu <avmo@xxxxxx>
  • To: fluiddyn@xxxxxxxxxxxxx
  • Date: Wed, 14 Nov 2018 21:15:36 +0100

Hi Julien,

This comes as a late reply!

I agree that the use of a dunder variable such as __file__ is a bit
hacky. It is also nice to have importlib.resources as a solution and we
could do that when python 3.7 becomes the norm. Instead of adding
another dependency, I found this interesting solution on StackOverflow:
<https://stackoverflow.com/a/20885799> which recommends using the
pkg_resources's resource manager API.
<https://setuptools.readthedocs.io/en/latest/pkg_resources.html#resourcemanager-api>

The bonus is pkg_resources is supplied with setuptools! To replace the
current approach, as an example

fluiddyn/fluiddyn/util/test/test_paramcontainer.py:xml_file = 
os.path.abspath(os.path.join(os.path.dirname(__file__), "file.xml"))

we should instead use

import pkg_resources
pkg_resources.resource_filename("fluiddyn", "util/test/file.xml")

Yes, we use relative path with "/", relative to the package root. There
are also other convenient functions in the API such as |resource_exists,
||resource_stream, and |resource_string.

Cheers,

Ashwin

On 5/9/18 7:09 AM, FreeLists Mailing List Manager wrote:

fluiddyn Digest       Tue, 08 May 2018        Volume: 01  Issue: 002

In This Issue:
              [fluiddyn] Use of __file__

----------------------------------------------------------------------

From: Julien Salort <listes@xxxxxxxxx>
Subject: [fluiddyn] Use of __file__
Date: Tue, 8 May 2018 11:03:11 +0200

Hello,


A recent thread on python-ideas, e.g.

https://mail.python.org/pipermail/python-ideas/2018-May/050428.html

has pointed out that it is bad practise to use __file__ to infer the 
path of resources within a package.

We should use importlib_resources (python < 3.7) or importlib.resources 
(upcoming python 3.7) instead:

http://importlib-resources.readthedocs.io/en/latest/index.html

I notice that there are a few occurences of __file__ in fluiddyn:

% find fluiddyn -name "*.py" -exec grep -H __file__ {} \;
fluiddyn/fluiddoc/fluiddocset.py: 
os.path.join(os.path.dirname(pkg.__file__), "../doc")
fluiddyn/setup.py:here = os.path.abspath(os.path.dirname(__file__))
fluiddyn/fluiddyn/util/test/test_util.py: 
util.modification_date(os.path.dirname(__file__))
fluiddyn/fluiddyn/util/test/test_paramcontainer.py:xml_file = 
os.path.abspath(os.path.join(os.path.dirname(__file__), "file.xml"))
fluiddyn/fluiddyn/util/matlab2py/test/test_matlab2py.py:here = 
os.path.abspath(os.path.dirname(__file__))
fluiddyn/fluiddyn/io/test/test_ns3d.py:input_dir = 
os.path.join(os.path.dirname(__file__), "ns3d_files")
fluiddyn/fluiddyn/io/test/test_rdvision.py: 
os.path.join(os.path.dirname(__file__), "rdvision_files")

% find fluidlab -name "*.py" -exec grep -H __file__ {} \;
fluidlab/setup.py:here = os.path.abspath(os.path.dirname(__file__))
fluidlab/fluidlab/objects/pumps.py:here = 
os.path.abspath(os.path.dirname(__file__))

% find fluidimage -name "*.py" -exec grep -H __file__ {} \;
fluidimage/fluidimage/calcul/correl_pycuda.py:    kernel_file = 
os.path.join(os.path.dirname(os.path.abspath(__file__)),
fluidimage/fluidimage/calcul/correl_pycuda.py:    kernel_file = 
os.path.join(os.path.dirname(os.path.abspath(__file__)),
fluidimage/fluidimage/calibration/test_tsai_calibration.py:here = 
os.path.abspath(os.path.dirname(__file__))
fluidimage/fluidimage/calibration/test_direct_stereo_reconstruction.py:here 
= os.path.abspath(os.path.dirname(__file__))
fluidimage/fluidimage/topologies/test_piv.py:here = 
os.path.abspath(os.path.dirname(__file__))
fluidimage/fluidimage/topologies/test_preproc.py:here = 
os.path.abspath(os.path.dirname(__file__))
fluidimage/fluidimage/topologies/test_im2im.py:here = 
os.path.abspath(os.path.dirname(__file__))
fluidimage/fluidimage/works/piv/test_piv.py:here = 
os.path.abspath(os.path.dirname(__file__))
fluidimage/setup.py:here = os.path.abspath(os.path.dirname(__file__))


I am not sure that this is wrong enough to actually go over all those 
files and remove the use of __file__ at the moment, but it is good to 
know for future code that this is not the recommanded method.

What do you think ?


Bests,


Julien


------------------------------

End of fluiddyn Digest V1 #2
****************************

Other related posts:

  • » [fluiddyn] Re: fluiddyn Digest V1 #2 - Ashwin Vishnu