Si se quiere evitar hardcoding rutas completas, archivo, clase y nombres de funciones en muchos lugares, se podría hacer algo como lo siguiente que importa dinámicamente (casi) todos los archivos del pitón se encuentra en el subdirectorio de un paquete .
La clave es recordar que el archivo __init__.py
es en sí mismo un script Python en gran medida sin restricciones y, por lo tanto, es libre de realizar un procesamiento propio bastante sofisticado para determinar qué hay en el espacio de nombres del paquete.
Archivo package\__init__.py
:
def _import_package_files():
""" Dynamically import all the Python modules in this module's sub directory. """
import os
import sys
import traceback
package_path = os.path.split(__file__)[0]
package_directory = os.path.split(package_path)[1]
for fn in os.listdir(package_directory):
globals_, locals_ = globals(), locals()
# process all python files in directory that don't start with underscore
if fn[0] != '_' and fn.split('.')[-1] in ('py', 'pyw'):
modulename = fn.split('.')[0] # filename without extension
subpackage = ".".join([package_directory, modulename])
try:
module = __import__(subpackage, globals_, locals_, [modulename])
except:
traceback.print_exc(file=sys.stdout)
raise # reraise exception
_import_package_files()
Archivo package\Class1.py
:
class Class1(object):
pass
Archivo package\Class2.py
:
class Class2(object):
pass
Archivo package\Class3.py
:
class Class3(object):
pass
Archivo usepackage.py
:
import package
print(package.Class1)
print(package.Class2)
print(package.Class3)
resultado de la ejecución usepackage.py
:
<module 'package.Class1' from 'C:\Files\package\Class1.pyc'>
<module 'package.Class2' from 'C:\Files\package\Class2.pyc'>
<module 'package.Class3' from 'C:\Files\package\Class3.pyc'>
¿Qué significa punto anterior? – samuil
@samuil: http://www.python.org/dev/peps/pep-0328/ –
Lamentablemente, estoy restringido a Python 2.4, ya que los scripts se ejecutarán en dispositivos integrados de terceros. Esta notación de puntos no parece funcionar en la versión heredada. Lo he reemplazado con una ruta completa a estos submódulos. – samuil