467,923 Members | 1,149 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 467,923 developers. It's quick & easy.

How can I import a script with an arbitrary name ?

Hi all,

I have a script responsible for loading and executing scripts on a
daily basis. Something like this:

import time
t = time.gmtime()
filename = t[0] + '-' + t[1] + '-' + t[2] + '.py'
import filename

So, I have a module with an arbitrary file name and I want to load it,
and later access its function definitions.
How can I do this ? In my example, the last line will obviously not
work.

Oct 30 '06 #1
  • viewed: 2417
Share:
10 Replies
wrote in news:11**********************@i42g2000cwa.googlegr oups.com in
comp.lang.python:
Hi all,

I have a script responsible for loading and executing scripts on a
daily basis. Something like this:

import time
t = time.gmtime()
filename = t[0] + '-' + t[1] + '-' + t[2] + '.py'
import filename

So, I have a module with an arbitrary file name and I want to load it,
and later access its function definitions.
How can I do this ? In my example, the last line will obviously not
work.
http://docs.python.org/lib/built-in-funcs.html

The first one __import__ should do the trick.

Rob.
--
http://www.victim-prime.dsl.pipex.com/
Oct 30 '06 #2
le***********@gmail.com wrote:
I have a script responsible for loading and executing scripts on a
daily basis. Something like this:

import time
t = time.gmtime()
filename = t[0] + '-' + t[1] + '-' + t[2] + '.py'
import filename

So, I have a module with an arbitrary file name and I want to load it,
and later access its function definitions.
execfile() is probably your best bet:

namespace = {}
execfile(filename, namespace)

namespace["function"](argument)

also see:

http://effbot.org/zone/import-string...ng-by-filename

</F>

Oct 30 '06 #3
I had to do something like this a while back for a modular IRC bot that
I wrote.
__import__() will do the trick, however to avoid getting a cache of the
module I recomend doing something like...

mod = reload( __import__("%s-%s-%s" % ( t[0], t[1], t[2] ) ) )
le***********@gmail.com wrote:
Hi all,

I have a script responsible for loading and executing scripts on a
daily basis. Something like this:

import time
t = time.gmtime()
filename = t[0] + '-' + t[1] + '-' + t[2] + '.py'
import filename

So, I have a module with an arbitrary file name and I want to load it,
and later access its function definitions.
How can I do this ? In my example, the last line will obviously not
work.
Oct 30 '06 #4
le***********@gmail.com writes:
So, I have a module with an arbitrary file name and I want to load it,
and later access its function definitions.
How can I do this ? In my example, the last line will obviously not
work.
If you want a solution that gives you an actual module object, here's
what I use:

def make_module_from_file(module_name, file_name):
""" Make a new module object from the code in specified file """

from types import ModuleType
module = ModuleType(module_name)

module_file = open(file_name, 'r')
exec module_file in module.__dict__

return module

--
\ "A celebrity is one who is known by many people he is glad he |
`\ doesn't know." -- Henry L. Mencken |
_o__) |
Ben Finney

Oct 30 '06 #5
On Tue, 31 Oct 2006 11:00:52 +1100, Ben Finney wrote:
If you want a solution that gives you an actual module object, here's
what I use:

def make_module_from_file(module_name, file_name):
""" Make a new module object from the code in specified file """

from types import ModuleType
module = ModuleType(module_name)

module_file = open(file_name, 'r')
exec module_file in module.__dict__

return module
Isn't that awfully complicated? What's wrong with using __import__ to get
a module object?
>>mod = __import__("math")
mod
<module 'math' from '/usr/lib/python2.4/lib-dynload/mathmodule.so'>
The only advantage (or maybe it is a disadvantage?) I can see to your
function is that it doesn't search the Python path and you can specify an
absolute file name.
--
Steven.

Oct 31 '06 #6
Steven D'Aprano wrote:
The only advantage (or maybe it is a disadvantage?) I can see to your
function is that it doesn't search the Python path and you can specify an
absolute file name.
that's the whole point of doing an explicit load, of course. if you
think that's a disadvantage, you haven't done enough plugin work...

</F>

Oct 31 '06 #7
"Steven D'Aprano" <st***@REMOVE.THIS.cybersource.com.auwrites:
On Tue, 31 Oct 2006 11:00:52 +1100, Ben Finney wrote:
If you want a solution that gives you an actual module object,
here's what I use:

def make_module_from_file(module_name, file_name):
""" Make a new module object from the code in specified file """

The only advantage (or maybe it is a disadvantage?) I can see to
your function is that it doesn't search the Python path and you can
specify an absolute file name.
Which is exactly what the OP asked for (though he didn't necessarily
need a module object).

--
\ "We have to go forth and crush every world view that doesn't |
`\ believe in tolerance and free speech." -- David Brin |
_o__) |
Ben Finney

Oct 31 '06 #8
On Tue, 31 Oct 2006 12:44:50 +0100, Fredrik Lundh wrote:
Steven D'Aprano wrote:
>The only advantage (or maybe it is a disadvantage?) I can see to your
function is that it doesn't search the Python path and you can specify an
absolute file name.

that's the whole point of doing an explicit load, of course. if you
think that's a disadvantage, you haven't done enough plugin work...
Guilty as charged.

--
Steven.

Oct 31 '06 #9
On Tue, 31 Oct 2006 22:53:56 +1100, Ben Finney wrote:
"Steven D'Aprano" <st***@REMOVE.THIS.cybersource.com.auwrites:
>On Tue, 31 Oct 2006 11:00:52 +1100, Ben Finney wrote:
If you want a solution that gives you an actual module object,
here's what I use:

def make_module_from_file(module_name, file_name):
""" Make a new module object from the code in specified file """

The only advantage (or maybe it is a disadvantage?) I can see to
your function is that it doesn't search the Python path and you can
specify an absolute file name.

Which is exactly what the OP asked for (though he didn't necessarily
need a module object).
I'm not arguing, you could very well be right, but I'm just curious what
part of the OP's post led you to believe he needed to specify an absolute
filename. Unless I'm missing a second post, he certainly never suggested
that his scripts weren't in the Python path, or that he couldn't add their
location to the path.

*shrug* It probably isn't important -- given the constraints as you read
them (extrapolated them?) your solution looks good.
--
Steven.

Oct 31 '06 #10
Steven D'Aprano wrote:
I'm not arguing, you could very well be right, but I'm just curious what
part of the OP's post led you to believe he needed to specify an absolute
filename. Unless I'm missing a second post, he certainly never suggested
that his scripts weren't in the Python path, or that he couldn't add their
location to the path.
the fact that he's using dashes in the module name might be a hint, though.

in current versions, __import__ doesn't care as long as the file has
the right extension, but import requires valid Python identifiers, for
obvious reasons.

execfile doesn't care about any part of the filename, of course (and if
you replace it with exec, you don't even have to read the script from a
file).

</F>

Oct 31 '06 #11

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

5 posts views Thread by Steve Holden | last post: by
79 posts views Thread by pinkfloydhomer | last post: by
14 posts views Thread by DataSmash | last post: by
9 posts views Thread by fegge | last post: by
10 posts views Thread by Jia Lu | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.