On Sun, Aug 27, 2017 at 6:03 PM, Cameron Simpson <c...@cskk.id.au> wrote:
> On 27Aug2017 14:27, boB Stepp <robertvst...@gmail.com> wrote:
>>
>> On Sun, Aug 27, 2017 at 2:13 AM, Cameron Simpson <c...@cskk.id.au> wrote:
>>>
>>> On 26Aug2017 21:27, boB Stepp <robertvst...@gmail.com> wrote:

>>> The trouble with this specific approach is that '..' relies on your
>>> _working_ directory being above ScriptMenuSystem i.e. the directory you
>>> shell's in; '..' is not related to the path to the test.py file. What yu
>>> want for this is the actual path to the code i.e. __file__.  Eg:
>>>
>>>  sys.path.append(dirname(dirname(__file__)))
>>
>>
>> I tried to use this (on Python 2.4/2.6 -- one server has 2.4, the
>> other 2.6) and got the following:
>>
>> Traceback (most recent call last):
>>    File "... /test.py", line 9, in <module>
>>        sys.path.append(dirname(dirname(__file__)))
>> NameError:  name 'dirname' is not defined
>
>
> from os.path import dirname

It did not occur to me to import something from os.path to use sys.path!


>> Anyway, I tried something a bit different that implemented this:
>>
>> pgm_dir = os.path.dirname(os.path.abspath(__file__))
>> pgm_root = pgm_dir.replace('/ScriptMenuSystem', '')
>> sys.path.append(pgm_root)
>
>
> Calling os.path.dirname a second time does what your:
>
>  pgm_dir.replace('/ScriptMenuSystem', '')
>
> does, but reliably. Supposing you have the misfortune to have
> '/ScriptMenuSystem' higher up in the full path also? Supposing your package
> changes its name in the future, or is installed with another name?
> Fragility.
>

>> BTW, I have not used os.walk yet, but would that be better than my bit
>> of string manipulation above?  If yes, an example of walking up and
>> getting the directory exactly one level up from __file__ would be
>> appreciated.

> Given that os.walk walks _down_ the tree from some directory, how do you
> think it would help you?

At https://docs.python.org/release/2.4.4/lib/os-file-dir.html it says:

"walk(top[, topdown=True [, onerror=None]])
walk() generates the file names in a directory tree, by walking the
tree either top down or bottom up."

So I thought I could go in either direction.

>> I have been using the same project structure for some years now, so in
>> that sense it is well-established and not fragile.
>
>
> It is more that embedded specific hardwired knowledge in the code is an
> inherently fragile situation, if only because it must be remembered when
> naming changes occur. And they do. I have a quite large package I've been
> working on for a decade and am very seriously contemplating changing its
> name in the next month or so. Fortunately the installed base is small.

I was working on removing the name dependencies.  So far I had the following:

import os
import sys

def set_project_root():
    pgm_dir = os.path.dirname(os.path.abspath(__filename__))
    dir_to_rmv = pgm_dir.split(os.sep)[-1]
    pgm_root = pgm_dir.replace(dir_to_rmv, '')
    sys.path.append(pgm_root)

But this only works if I only need to go up one level.  If I have
Python files more deeply nested in the project structure than this
won't work.  So I was pondering how I can do this for arbitrarily
deeply nested folders without relying on any specific naming.  I was
also wondering if this sort of code could be put in the __init__.py
files?  I have yet to do this latter experiment.

>> So I am moving to put everything in a centrally accessible
>> location
>
>
> Very sound. But to use it your users should have that location as part of
> their python path, or the code needs to be invoked by some wrapper which can
> insert the needed path. Both these things live _outside_ the package code.

Not being well-versed in Unix, is it possible to change the PYTHONPATH
*only* for a specific group of users and only for python programs in a
certain shared library area?  I will have to research this.  If
possible, this might indeed be the best way.

>> So I think this idea (Or some variation thereof.) is what I need to
>> do.  Or the good experts here show me I'm engaged in foolishness!
>
>
> I think you're better off arranging your users' environments to include the
> shared library area, or providing a wrapper shell script which does that and
> then invokes the real code.
>
> Eg:
>
>  #!/bin/sh
>  PYTHONPATH=/path/to/your/shared/lib:$PYTHONPATH
>  export PYTHONPATH
>  python -m your.module.name ${1+"$@"}
>
> Such a script has the advantage that the $PYTHONPATH change applies only to
> the python running your module, not to your users' wider environment.

This looks doable, though it complicates how I will call my python
programs.  These are always invoked by the Pinnacle HotScript
language.  Everything must start from within the Pinnacle planning
environment.


-- 
boB
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to