Altering imported modules

Steve Holden steve at
Tue Mar 4 17:06:29 CET 2008

Tro wrote:
> On Monday 03 March 2008, castironpi at wrote:
>> On Mar 3, 5:09 pm, Tro <trowo... at> wrote:
>>> On Sunday 02 March 2008, Paul McGuire wrote:
>>>> On Mar 2, 3:48 pm, Tro <trowo... at> wrote:
>>>>> On Sunday 02 March 2008, Terry Reedy wrote:
>>>>>> "Tro" <trowo... at> wrote in message
>>>>>> news:200803011856.27611.troworld at
>>>>>> | Hi, list.
>>>>>> |
>>>>>> | I've got a simple asyncore-based server. However, I've modified
>>>>>> | the
>>>>>> asyncore
>>>>>> | module to allow me to watch functions as well as sockets. The
>>>>>> | modified asyncore module is in a specific location in my project
>>>>>> | and is imported
>>>>>> as
>>>>>> | usual from my classes.
>>>>>> |
>>>>>> | Now I'd like to use the tlslite library, which includes an
>>>>>> | asyncore mixin class. However, tlslite imports "asyncore", which
>>>>>> | doesn't include my own modifications.
>>>>>> |
>>>>>> | I'd like to know if it's possible to make tlslite load *my*
>>>>>> | asyncore
>>>>>> module
>>>>>> | without changing any of the tlslite code.
>>>>>> If your module is also 'asyncore' and comes earlier in the search
>>>>>> path, I would expect the import to get yours.
>>>>> It's not. It has a package prefix like my.package.asyncore. I think I
>>>>> can either move my version of asyncore up a couple of levels or add
>>>>> the my.package directory to sys.path.
>>>>> My version of asyncore imports several functions from the built-in
>>>>> asyncore. Now that my version of it is imported as asyncore, how
>>>>> would it import the built-in version from python2.5/site-packages?
>>>>> Thanks,
>>>>> Tro
>>>> What happens if you do "import my.package.asyncore as asyncore"?
>>>> If that doesn't work (trying the simplest hack first), I know that
>>>> there are various hooks in the import mechanism that should help.
>>> In the classes that use my version of asyncore currently, that is how I
>>> do it. I import my version as "import my.package.asyncore as asyncore".
>>> In my asyncore module I do "import asyncore", because I override a few
>>> functions from the asyncore module included with python. However, if I
>>> were to add "my.package" to sys.path, then I wouldn't be able to "import
>>> asyncore" from my own asyncore module. I'd have to do some trickery with
>>> sys.path to take the "my.package" component out, import standard
>>> asyncore, readd the "my.package" component, so that other modules can
>>> "import asyncore" and get my version.
>>> Is there a way to import the standard python asyncore module in this
>>> scenario?
>>> Thanks,
>>> Tro
>> Are you trying to interfere with the default module on only your
>> machine?  Just rename it.  If something in the std. lib. imports
>> asyncore, they get yours too that way.
> No, I'd like it to be a generalized solution and only for this one project. 
> I'm trying to get it to work on any recent python installation out of the 
> box, so I can't rename built-in modules. What I'm trying to do is allow a 3rd 
> party module (tlslite) to import *my* version of asyncore without me going 
> into tlslite's code and changing its import statement explicitly, but only 
> for the scope of this one project.

In that case try something like

import myasyncore as asnycore
sys.modules['asyncore'] = asyncore
import tlslite

Steve Holden        +1 571 484 6266   +1 800 494 3119
Holden Web LLC    

More information about the Python-list mailing list