creating package question

E

erick_bodine

I have a package directory structure as follows

root-
|
Common (contains __init__.py file)
WindowsComponents (contains __init__.py file)
...

I would like modules in the WindowsComponents directory to be able to
import some modules from the Common directory. In my first pass, I was
able to append sys.path ( sys.path.append('../Common') ) in each module
that wants to import from Common, but this feels "clunky". Is there a
"standard"/"best" way to accomplish this?

--ERick
 
E

erick_bodine

I think I have an answer to my own question. In the
WindowsComponents/__init__.py file, I have the following, that feels
like a better answer for the problem. Is there a better answer than
this?

import os, sys
sys.path.append(os.path.join(os.getcwd(), 'Common'))


--ERick
 
I

infidel

I think I have an answer to my own question. In the
WindowsComponents/__init__.py file, I have the following, that feels
like a better answer for the problem. Is there a better answer than
this?

import os, sys
sys.path.append(os.path.join(os.getcwd(), 'Common'))

My solution to this is to use a .pth file. In my site-packages folder
under the python installation, I have a file named infidel.pth. This
file contains the path to the folder where I put all my python source
code (C:\src\py). In your case, you could have the path to your 'root'
folder.

One of my projects is structured like this:

C:\src\py
infidel\
__init__.py
models\
__init__.py
basemodel.py
views\
__init__.py
baseview.py
controllers\
__init__.py

Now the controllers package can do imports like this:

from infidel.models import basemodel
from infidel.views import baseview

The point is that the .pth file in site-packages adds custom paths to
your sys.path
 
M

Micah Elliott

I have a package directory structure as follows

root-
|
Common (contains __init__.py file)
WindowsComponents (contains __init__.py file)
...

I would like modules in the WindowsComponents directory to be able
to import some modules from the Common directory.

So you now have a "Common" package. And it might contain a "mustard"
module.
In my first pass, I was able to append sys.path (
sys.path.append('../Common') ) in each module that wants to import
from Common, but this feels "clunky".

Agreed. You probably want to avoid messing with sys.path whenever
possible.
Is there a "standard"/"best" way to accomplish this?

So "root" should already be on your sys.path/PYTHONPATH.

Then in say file "root/WindowsComponents/spam.py":

from Common import mustard
...
mustard.attr

More import info from Fredrik:
http://effbot.org/zone/import-confusion.htm
 
B

Bruno Desthuilliers

(e-mail address removed) a écrit :
I think I have an answer to my own question. In the
WindowsComponents/__init__.py file, I have the following, that feels
like a better answer for the problem. Is there a better answer than
this?

import os, sys
sys.path.append(os.path.join(os.getcwd(), 'Common'))

Err... if the script is called from somewhere else, this won't work.
replace os.getcwd() with os.path.dirname(os.path.realpath(__file__))

Or better, use a .pth or add the needed path in your PYTHONPATH
 
E

erick_bodine

Bruno said:
(e-mail address removed) a écrit :

Err... if the script is called from somewhere else, this won't work.
replace os.getcwd() with os.path.dirname(os.path.realpath(__file__))
Right, I anticipate the script(s) won't be called from elsewhere,
but....
Or better, use a .pth or add the needed path in your PYTHONPATH
THis would be ideal if I could gaurantee that the users (other software
testers) would install the *.pth file.

thanks for all the suggestions.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,430
Messages
2,571,676
Members
48,796
Latest member
Greg L.

Latest Threads

Top