Is it only possible if I rename the file? Or is there a __module__
variable to the file to define what's its name?
views:
668answers:
6Yes, you should rename the file. Best would be after you have done that to remove the oldname.pyc
and oldname.pyo
compiled files (if present) from your system, otherwise the module will be importable under the old name too.
Every class has an __module__
property, although I believe changing this will not change the namespace of the Class.
If it is possible, it would probably involve using setattr to insert the methods or class into the desired module, although you run the risk of making your code very confusing to your future peers.
Your best bet is to rename the file.
Where would you like to have this __module__
variable, so your original script knows what to import? Modules are recognized by file names and looked in paths defined in sys.path
variable.
So, you have to rename the file, then remove the oldname.pyc
, just to make sure everything works right.
If you really want to import the file 'oldname.py' with the statement 'import newname', there is a trick that makes it possible: Import the module somewhere with the old name, then inject it into sys.modules
with the new name. Subsequent import statements will also find it under the new name. Code sample:
# this is in file 'oldname.py'
...module code...
Usage:
# inject the 'oldname' module with a new name
import oldname
import sys
sys.modules['newname'] = oldname
Now you can everywhere your module with import newname
.
You can change the name used for a module when importing by using as:
import foo as bar
print bar.baz
When you do import module_name
the Python interpreter looks for a file module_name
.extension
in PYTHONPATH. So there's no chaging that name without changing name of the file. But of course you can do:
import module_name as new_module_name
or even
import module_name.submodule.subsubmodule as short_name
Useful eg. for writing DB code.
import sqlite3 as sql
sql.whatever..
And then to switch eg. sqlite3
to pysqlite
you just change the import line