yes i know it's related to search path, but i don't know how to set it in a
practical way (beside hard coding).
my concern is, if i want to create a custom module/library, i don't know
what py file will import it and where the working directory should be.
Regarding where the current working directory is -- on Linux your right,
you probably don't know where it is going to be. On Windows -- you can
pretty much demand that users set up the launcher so that your python
program is opened in a specific location -- typically the root directory
of the installed package. So in the windows situation -- if all your
components are in that package directory you can access everything via
relative roots. Linux is not so easy -- I'll get to that.
On the other hand, if your installing a general directory library module
that your going to use from a variety of other programs, then you need to
have the installer setup things so other applications can find it. The
standard way to do this is to use the distutils package that is part of the
python distribution to install these modules in a standard location which
should already be in the search path. If you don't want to do that you
have to do something special: on windows create a registry entry that
can be accessed and looked up probably, or setup the default python path
for your system (or user) to include the extra directories, or like GNOME
does on Linux -- create a script in the executable search path
that your program or installer can run -- and have it return the path you
need.
So on the application side, you'd find out the location of the library as
described above and set sys.path. You can either do this at launch time
in your main program -- or you can have the installer hard code it at the
top of the main program.
This is not really any different then for example using shared libraries.
You either need to install all of your modules in the search path to start
with or you need to modify the search path by some method.
There is one more thought -- if you want to find out where the python
module is in the file system -- there are sometimes ways to do this --
I've never done this but I have some notes somewhere about this. This
might also be helpful in finding directories for example. If your
interested in this -- maybe someone else here can remember?
But if i put a set of classes in a py file as a module, will it increase
the dependency of each class?
back to my example, of course, i can put BaseA and ClassA together in one py
file. what should i do when i need to add one more class later, "ClassB",
which also extend BaseA. Put it into the same file or in a new file? if put
in in the same file, i think it should difficult to maintain versioning.
Versioning -- hmm. Well I think it depends. If ClassB is intended to be
a general capability that you want to add to to moduleA (the module with
BaseA and ClassA), then add it to moduleA but make the module upwardly
compatible. If you want to track versions, then just keep old version
snapshots if you need to or use something like CVS to do it for you. I'm
pretty basic so I keep old copies but try to make my general libraries
upwardly compatible if possible.
Of course on the other hand, if the new class classB has a special function
then I'd either create a new module, or I'd just include it into my main
program module, or some other application module. To merge the functions
just import what you need into that module. I for example often use "from
mymodule import *" which imports everything rather than the limited
imports you used -- nothing wrong with either, just a matter of taste. I
also often use "import" and write the full module name when I reference
things too.
The point is -- I personally think one should look at modules as being
collections of functions, classes, and other constructs that form
librararies rather than putting each class and function in a separate
module.
Thanks,
Rob