Newbie questions on import & cmd line run
gwhite
gwhite at ti.com
Fri May 18 17:55:55 EDT 2012
On May 16, 9:54 pm, alex23 <wuwe... at gmail.com> wrote:
> On May 17, 11:45 am, gwhite <gwh... at ti.com> wrote:
>
> > 1. If running from the system command line, or the Sypder "run"
> > button, "__name__" is "__main__" rather than "newbie00", as seen
> > above.
>
> > So, how would I get the file name newbie00.py in these two noted
> > cases?
>
> You can get it from the file name:
>
> import os.path
> name = os.path.split(__file__)[-1]
>
> However, you might find it better in the long term to always separate
> your code into import-only modules and execute-only scripts. It avoids
> this issue and others.
Thanks, and yes, I am starting to see your point.
> > 2. Is there a shortened syntax of running a .py from the python command
> > prompt, if not using a Spyder "run" button? Or should I always run as
> > if from the system prompt? That is, dispense with the MATLAB-like
> > "run from MATLAB/python command line" bias I may be holding.
>
> Generally, the correct way of running Python code from the interpreter
> is 'import <module>'. You might find this pattern useful:
>
> In your module:
>
> def main(): # code goes here
>
> if __name__ == '__main__': main()
>
> Then from the interpreter:
>
> import mymodule; mymodule.main()
I am going to play with the idea.
> > 3. In injecting my old MATLAB bias of running via the command line
> > ">> mfilename", I tried a tweak of ">>>import newbie00". That "sort
> > of" worked, but only the first time.
>
> > Why did the subsequent run of ">>>import newbie00" print nothing? I'm
> > just trying to understand how python works.
>
> The import mechanism only imports a module once, as all files use the
> same module instance (they're effectively singletons). This happens
> with repeated imports in one module as well as across various modules
> during a single execution. So re-importing a module does nothing; to
> force a re-import, you can use the reload() function, although that
> doesn't guarantee updating all references. For example:
>
> import mymodule
> from mymodule import myfunc
>
> # modify myfunc code externally
>
> reload(mymodule)
> myfunc() # original reference
> mymodule.myfunc() # newly modified function
>
> I don't think that only-one-import is true for scripts that are run
> from the command line, though. They can exist as both '__main__' and
> their actual name in the module table. (Someone please correct me if
> this understanding is wrong...)
>
> > 4. The final case shown of hitting the Spyder run button included
> > this:
>
> > UMD has deleted: newbie00
>
> > What does that mean? I noted that after this "automatic" deletion, I
> > could do the ">>>import newbie00" once again and get the print. (I
> > did not show that above.)
>
> Spyder provides a convenience feature to force the reimport of user-
> defined modules, like your newbie00. After execution, it appears to
> drop all references to your module, forcing a garbage collection. As
> its no longer loaded, a subsequent import works.
>
> > 5. I think #4 implies an import can be removed. (Yes/No?) I am not
> > sure why that would be desired, but I will ask how to remove an
> > import, or to "refresh" the run, of that is the appropriate question.
>
> reload(<module>)
>
> However, the only way to guarantee you've updated all references
> correctly is to close the interpreter and re-start it. For this kind
> of development process of modifying code and seeing the changes, it's
> probably better to look into writing tests instead. These will always
> be run in isolation, so you're guaranteed of having the correct
> environment each time.
I think I mostly need to revise my tact. Some of these questions came
from my MATLAB-centric way of thinking, and I am unlearning that.
> > I think I saw someplace where a .pyc file is created on an initial run
> > and subsequently run instead of the .py. I'm not sure if that applies
> > here, but if related, I guess an auxiliary question is how to easily
> > force the .py to run rather than the .pyc?
>
> A .pyc file won't be created for .py files that are run directly, only
> for those that are imported. You really shouldn't need to worry about
> this, though. It's an implementation detail that isn't influencing the
> issues you're seeing. However, if you do ever need to do it, you can
> stop .pyc files by passing the -B flag to the interpreter, or by
> setting the environment variable PYTHONDONTWRITEBYTECODE.
>
> > 6. Perhaps peripherally related to getting a running script/function/
> > module name, is getting a "call listing" of all the functions (and
> > modules) called by a .py program. How would I get that? I only ask
> > as it comes in handy if one distributes a program. I mean, you only
> > give people what they actually need.
>
> Perhaps this might be of use:http://pycallgraph.slowchop.com/
I was thinking along the lines of this, should you remotely care:
http://www.mathworks.com/help/techdoc/ref/depfun.html
But the more I think of it, the difference between scripts/programs,
and modules/functions in python make this much less of an issue than I
had thought.
In MATLAB, there is no important distinction between them, so I was
probably misguided with the concern/question. As I examine it, the
nature of python sort makes this one take care of itself to a large
degree. I mean to say, "imports" in python are obvious. There is no
"import" corollary in MATLAB. Let the unlearning begin.
> Hope this helps.
It does. Thanks for your help, Alex. It is much appreciated.
More information about the Python-list
mailing list