absolute path to a file

Cameron Simpson cs at cskk.id.au
Mon Aug 19 08:16:34 EDT 2019


On 19Aug2019 08:52, Paul St George <email at paulstgeorge.com> wrote:
>On 19/08/2019 01:31, Cameron Simpson wrote:
>>On 18Aug2019 17:29, Paul St George <email at paulstgeorge.com> wrote:
>>>On 18/08/2019 02:03, Cameron Simpson wrote:
>>>1: Is image01.tif a real existing file when you ran this code?
>>>Yes. image01.tif is real, existing and apparent.
>>But in what directory? What is its _actual_ full path as you expect it 
>>to be?
>
>Aha. The Blender file that I am using to test this on has two images 
>used as textures. They reside at:
>/Users/Lion/Desktop/test8/image01.tif
>/Users/Lion/Desktop/images/image02.tif
>
>The Blender file is at /Users/Lion/Desktop/test8/tifftest8.blend

There's a remark on that web page I mentioned that suggests that the 
leading '//' indicates the filename is relative to the Blender model, so 
the context directory for the '//' is likely /Users/Lion/Desktop/test8.

>>>(Chris and Peter lead me to believe that Blender has a special kind 
>>>of relative path. The double slashes replace the path to the blend 
>>>file’s directory.) realpath has done something but I know not what.

realpath needs a UNIX path. Your //image01.tif isn't a UNIX path, it is 
a special Blender path. First you need to convert it. By replacing '//' 
with the blend file's directory. Then you can call realpath. If you 
still need to.

[...snip...]
>>So you might want to write an unBlenderiser (untested example):
>>
>>  from os.path import isabs, join as joinpath
>>
>>  def unblenderise(filename, context_dir=None):
>>    # transmute Blender "relative" path
>>    if filename.startswith('//'):
>>      filename = filename[2:]
>>    if not isabs(filename) and context_dir is not None:
>>      # attach the filename to `context_dir` if supplied
>>      filename = joinpath(context_dir, filename)
>>    return filename
>>
>>The idea here is to get back a meaningful UNIX path from a Blender 
>>path. It first strips a leading '//'. Next, _if_ the filename is 
>>relative _and_ you supplied the optional context_dir (eg the 
>>directory used for a file brwoser dialogue box), then it prepends 
>>that context directory.
>>
>>This _does not_ call abspath or realpath or anything, it just 
>>returns a filename which can be used with them.
>>
>>The idea is that if you know where image01.tif lives, you could 
>>supply that as the context directory.
>
>Yes! Until Peter Otten's timely intervention, I was trying to do this 
>and had managed to join the 
>path_to_the_folder_that_contains_the_Blender_file to 
>the_name_of_the_image (stripped of its preceding slashes).
>
>Your unblenderise looks much better than my nascent saneblender so 
>thank you. I will explore more!

Looks like you want wd=os.path.dirname(path_of_blend_file).

>Does it depend on knowing where image01.tif lives and manually 
>supplying that?

Sort of.

What you've got is '//image01.tif', which is Blender's special notation 
indicating a filename relative to the blend file's directory. All the 
Python library stuff expects an OS path (OS==UNIX on a Mac). So you want 
to convert that into a UNIX path.  For example:

    from os.path import dirname

    # Get this from somewhere just hardwiring it for the example.
    # Maybe from your 'n' object below?
    blend_file = '/Users/Lion/Desktop/test8/tifftest8.blend'

    blender_image_file = n.image.filename

    unix_image_file = unblenderise(blender_image_file, dirname(blend_file))

Now you have a UNIX path. If blend_file is an absolute path, 
unix_image_path will also be an absolute path. But if blend_file is a 
relative path (eg you opened up "tifftest8.blend") unix_image_path will 
be a relative path.

You don't need to use realpath or abspath on that _unless_ you need to 
reference the file from any directory (i.e. _not_ relative to where you 
currently are).

Cheers,
Cameron Simpson <cs at cskk.id.au>



More information about the Python-list mailing list