__init__.py, __path__ and packaging

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Sandro Dentella

    #1

    __init__.py, __path__ and packaging


    Hi everybody,

    I'm trying to fix the packaging of a very simple package, but some problem
    show me that I have not well understood the whole mechanism

    The structure of my package (some debug functions) is as follows:

    python/
    `-- dbg/
    |-- __init__.py
    `-- lib
    |-- __init__.py
    |-- debug.py
    `-- gtk_dbg.py


    my sys.path includes 'python' and I wanted that the content of debug.py was
    simply included by: 'import dbg', so I wrote dbg/__init__.py as follows:

    import os
    Dir = os.path.dirname (__file__)
    __path__ = [os.path.join(Di r, 'lib')]
    from debug import *

    It seems to work:

    python$ python -c 'import dbg; print dir(dbg)'
    ['DBG', 'Dir', '__builtins__', '__doc__', '__file__', '__name__', \
    '__path__', 'caller', 'debug', 'dshow', 'os', 're', 'show_caller', \
    'sql_debug', 'sys']

    BUT, if I set some variables they are not correctly seen:

    import dbg
    dbg.DBG = 1


    function test included in debug.py raises NameError:

    def test():
    print DBG

    NameError: global name 'DBG' is not defined`

    What's happening? DBG seems to be set, as shown by dir(dbg)... any hints?
    I'd also accept a hint for a different approch, if it's the case, but I'd
    really would also understant this issue

    Thanks in advance
    sandro
    *:-)

    --
    Sandro Dentella *:-)
    http://www.tksql.org TkSQL Home page - My GPL work
  • Scott David Daniels

    #2
    Re: __init__.py, __path__ and packaging

    Sandro Dentella wrote:[color=blue]
    > The structure of my package:
    >
    > python/
    > `-- dbg/
    > |-- __init__.py
    > `-- lib
    > |-- __init__.py
    > |-- debug.py
    > `-- gtk_dbg.py
    >
    > my sys.path includes 'python' and I wanted that the content of debug.py was
    > simply included by: 'import dbg', so I wrote dbg/__init__.py as follows:
    >
    > import os
    > Dir = os.path.dirname (__file__)
    > __path__ = [os.path.join(Di r, 'lib')]
    > from debug import *[/color]

    What you probably want in python/dbg/__init__.py to get values is:

    from dbg.lib.debug import *
    [color=blue]
    > BUT, if I set some variables they are not correctly seen:
    > import dbg
    > dbg.DBG = 1
    > function test included in debug.py raises NameError:
    > def test():
    > print DBG
    > NameError: global name 'DBG' is not defined`
    >
    > What's happening? DBG seems to be set, as shown by dir(dbg)... any hints?[/color]
    You misunderstand modules and python variables. Each module has a
    dictionary associating the names of its globals and their current
    values. After:
    import dbg.lib.debug, dbg.lib.gtk_dbg
    you have four modules:
    dbg # Corresponds to python/dbg/__init__.py
    dbg.lib # Corresponds to python/dbg/lib/__init__.py
    dbg.lib.debug # Corresponds to python/dbg/lib/debug.py
    dbg.lib.gtk_dbg # Corresponds to python/dbg/lib/gtk_dbg.py
    Each has its own globals.
    after:
    dbg.DBG = 1
    the dbg module's global dictionary contains an entry mapping 'DBG' to 1
    after:
    dbg.DBG = 1+2
    the dbg module's global dictionary contains an entry mapping 'DBG' to 3

    In no case will an assignment to a global in dbg cause an assignment to
    anything in dbg.lib.debug. The "from dbg.lib.debug import *" statement
    can be seen as a module import followed by a fancy multiple assignment,
    where module dbg.lib.debug is first imported, then its globals are
    assigned to globals of the same names in module dbg.

    --Scott David Daniels
    scott.daniels@a cm.org

    Comment

    • Sandro Dentella

      #3
      Re: __init__.py, __path__ and packaging

      In comp.lang.pytho n, hai scritto:[color=blue]
      > Sandro Dentella wrote:[color=green]
      >> The structure of my package:
      >>
      >> python/
      >> `-- dbg/
      >> |-- __init__.py
      >> `-- lib
      >> |-- __init__.py
      >> |-- debug.py
      >> `-- gtk_dbg.py
      >>
      >> my sys.path includes 'python' and I wanted that the content of debug.py was
      >> simply included by: 'import dbg', so I wrote dbg/__init__.py as follows:
      >>
      >> import os
      >> Dir = os.path.dirname (__file__)
      >> __path__ = [os.path.join(Di r, 'lib')]
      >> from debug import *[/color]
      >
      > What you probably want in python/dbg/__init__.py to get values is:
      >
      > from dbg.lib.debug import *[/color]

      This does not work:

      Traceback (most recent call last):
      File "<string>", line 1, in ?
      File "dbg/__init__.py", line 8, in ?
      from dbg.lib.debug import *
      ImportError: No module named lib.debug


      [color=blue]
      >[color=green]
      >> BUT, if I set some variables they are not correctly seen:
      >> import dbg
      >> dbg.DBG = 1
      >> function test included in debug.py raises NameError:
      >> def test():
      >> print DBG
      >> NameError: global name 'DBG' is not defined`
      >>
      >> What's happening? DBG seems to be set, as shown by dir(dbg)... any hints?[/color]
      > You misunderstand modules and python variables. Each module has a
      > dictionary associating the names of its globals and their current
      > values. After:
      > import dbg.lib.debug, dbg.lib.gtk_dbg
      > you have four modules:
      > dbg # Corresponds to python/dbg/__init__.py
      > dbg.lib # Corresponds to python/dbg/lib/__init__.py
      > dbg.lib.debug # Corresponds to python/dbg/lib/debug.py
      > dbg.lib.gtk_dbg # Corresponds to python/dbg/lib/gtk_dbg.py
      > Each has its own globals.
      > after:
      > dbg.DBG = 1
      > the dbg module's global dictionary contains an entry mapping 'DBG' to 1
      > after:
      > dbg.DBG = 1+2
      > the dbg module's global dictionary contains an entry mapping 'DBG' to 3
      >
      > In no case will an assignment to a global in dbg cause an assignment to
      > anything in dbg.lib.debug. The "from dbg.lib.debug import *" statement
      > can be seen as a module import followed by a fancy multiple assignment,
      > where module dbg.lib.debug is first imported, then its globals are
      > assigned to globals of the same names in module dbg.[/color]

      This confirms to me that I'm seriously confused... so I started with a very
      simple setup:
      $ cat dbg.py
      DBG = 1
      def test():
      global DBG
      print DBG

      def set():
      global DBG
      DBG = 3


      $ cat m.py
      from dbg import *

      test()
      #dbg.DBG = 2 ## does not work, no way to assign in module dbg
      set() # this acts in dbg module and sets 'DBG = 3'
      test() # test the value of DBG
      print DBG


      $ python m.py
      1
      3 # changed by 'set' that was 'imported'
      1 # value of local DBG

      isn't this contraddicting you words:
      [color=blue]
      > can be seen as a module import followed by a fancy multiple assignment,
      > where module dbg.lib.debug is first imported, then its globals are
      > assigned to globals of the same names in module dbg.[/color]

      So: which is the way I can change a value of a package 'imported', only with
      a function that sets it? is there a way to assign the value directly?
      is there any way to make some introspection of what is really there (in
      dbg)?

      Thanks angain for any possible hint.

      sandro
      *:-)



      --
      Sandro Dentella *:-)
      http://www.tksql.org TkSQL Home page - My GPL work

      Comment

      • Sandro Dentella

        #4
        Re: __init__.py, __path__ and packaging

        > Now, why you couldn't do "dbg.DBG = ..."? Very simple... "from[color=blue]
        > module import *" doesn't give you a dbg /module/, it only gives you
        > references to each piece inside the module.[/color]

        really the reason why I wanted that should probably be solved in other
        ways. I just wanted to split my dbg module in different files but load the
        dbg module in one single operation:

        dbg/
        |-- __init__.py
        |-- lib
        |-- __init__.py
        |-- debug.py
        |-- gtk_dbg.py

        and inside dbg/__init__.py I used "from dbg.debug import *" so that a single
        'import dbg' could present me the module 'debug' (of course in this simple
        case seems easier to put debug.py directly under dbg, but my main case is
        a much more complex module, with a tree structure that reflects the
        relation between modules that I want to hide to the end user).

        But to summarize, if I use 'from my_module import *' there is no way to reach
        directly 'my_module' and set a variable there?

        Thanks again
        sandro
        *:-)
        [color=blue]
        > I'm trying to fix the packaging of a very simple package, but some problem
        > show me that I have not well understood
        >
        > the structure of my package (some debug functions) is as follows:
        >
        > python/
        > `-- dbg/
        > |-- __init__.py
        > `-- lib
        > |-- __init__.py
        > |-- debug.py
        > `-- gtk_dbg.py
        >
        >
        > my sys.path includes 'python' and I wanted that the content of debug.py was
        > simply included by: 'import dbg', so I wrote dbg/__init__.py as follows:
        >
        > import os
        > Dir = os.path.dirname (__file__)
        > __path__ = [os.path.join(Di r, 'lib')]
        > from debug import *
        >
        >[/color]
        --
        Sandro Dentella *:-)
        e-mail: sandro@e-den.it
        http://www.tksql.org TkSQL Home page - My GPL work

        Comment

        Working...