2012-10-12 120 views
5

lo siento si me equivoqué con algunos hechos durante este pero solo he estado programando durante aproximadamente un año, desde que comencé un curso de computación en mi escuela, y lo siento si esta pregunta ha sido respondí antes de haber buscado en todas partes, pero no sé qué buscar. Recientemente me encontré con un juego en el que puede utilizar un inyector para inyectar código Python en ella, pero la única manera de encontrar los códigos es mediante el uso de:Intentando imprimir cada submódulo dentro de un módulo en python

import modulename 
    print dir(modulename) 

y luego dir de impresión (modulename.submodulename)

Que imprimiría todos los submódulos dentro de ese módulo al archivo de registro del juego. Usando esta técnica he desarrollado un script que, cuando se ejecuta, busca todos los submódulos en ese directorio y los escribe en un archivo.

import modulename 

myfile=open("name.txt","w") 
myfile.write("modulename\n") 

for a in dir(modulename): 
    a="modulename"+"."+a 
    for b in dir(a): 
     b=a+"."+b 
     for c in dir(b): 
      c=b+"."+c 
      if ".__" in c: 
       pass 
      elif "._" in c: 
       pass 
      else: 
       myfile.write(c+"\n") 
     if ".__" in b: 
      pass 
     if "._" in b: 
      pass 
     else: 
      myfile.write(b+"\n") 
    if ".__" in a: 
     pass 
    if "._" in a: 
     pass 
    else: 
     myfile.write(a+"\n") 

print "Done" 
myfile.close() 

Desafortunadamente, cuando se pasa el "algo.algo" los módulos son inexistentes. Aquí hay una muestra para el módulo "Aleatorio" donde "random.weibullvariate" es un módulo real pero algo más allá del segundo "." no está en los submódulos aleatorios.

random.weibullvariate.title.translate 
random.weibullvariate.title.upper 
random.weibullvariate.title.zfill 
random.weibullvariate.title 
random.weibullvariate.translate.capitalize 
random.weibullvariate.translate.center 
random.weibullvariate.translate.count 
random.weibullvariate.translate.decode 
random.weibullvariate.translate.encode 
random.weibullvariate.translate.endswith 
random.weibullvariate.translate.expandtabs 
random.weibullvariate.translate.find 
random.weibullvariate.translate.format 
random.weibullvariate.translate.index 
random.weibullvariate.translate.isalnum 
random.weibullvariate.translate.isalpha 
random.weibullvariate.translate.isdigit 
random.weibullvariate.translate.islower 
random.weibullvariate.translate.isspace 
random.weibullvariate.translate.istitle 
random.weibullvariate.translate.isupper 
random.weibullvariate.translate.join 
random.weibullvariate.translate.ljust 
random.weibullvariate.translate.lower 
random.weibullvariate.translate.lstrip 
random.weibullvariate.translate.partition 
random.weibullvariate.translate.replace 
random.weibullvariate.translate.rfind 
random.weibullvariate.translate.rindex 
random.weibullvariate.translate.rjust 
random.weibullvariate.translate.rpartition 
random.weibullvariate.translate.rsplit 
random.weibullvariate.translate.rstrip 
random.weibullvariate.translate.split 
random.weibullvariate.translate.splitlines 
random.weibullvariate.translate.startswith 
random.weibullvariate.translate 

Como puede ver, hay submódulos colocados que no existen en "al azar". Terminé averiguando cuál es el problema, pero no tengo experiencia suficiente para resolver el problema.

El problema es que el uso de las 2 primeras líneas como ejemplo

for a in dir(modulename): 
    a="module name"+"."+a 

si lo hiciera un "modulename.submodule" Como se puede ver "a" es una cadena, y si a continuación, poner "a" en un "dir()" entonces lo mismo se devolvería sin importar el nombre de los submódulos.

Necesito encontrar una forma de agregar el submódulo al nombre de los módulos anteriores con un "." en el medio sin convertirlo en una cadena.

Perdón por la publicación larga, ¿alguien tiene alguna idea?

+1

Probablemente me he equivocado con lo que está preguntando, de todos modos puede obtener el nombre del módulo con el atributo '__name__' y puede usar' '.'. Join (["paquete", "subpaquete", "módulo"] ]) 'para unir un número variable de campos con el punto. – Bakuriu

+0

Voy a intentar esto, gracias. Voy a responder si llego a algún lado :) – Freshollie

+0

¿Te refieres a esto? "para b en dir (". ". join ([nombremodelo, a])):" – Freshollie

Respuesta

4
import types 

def list_modules(module_name): 
    try: 
     module = __import__(module_name, globals(), locals(), [module_name.split('.')[-1]]) 
    except ImportError: 
     return 
    print(module_name) 
    for name in dir(module): 
     if type(getattr(module, name)) == types.ModuleType: 
      list_modules('.'.join([module_name, name])) 

No puedo afirmar que esto funcionará en todos los casos, pero vale la pena intentarlo?

+0

voy a dar una oportunidad, gracias. – Freshollie

+0

¿Dónde se supone que debo usar esto, si lo intento y la entrada de un módulo en el que da ">>> list_modules (al azar) Rastreo (llamada más reciente pasado): Archivo" ", línea 1, en list_modules (random) Archivo "C:/Users/FreshOllie/Documents/Python (Computing) /test.py", línea 6, en list_modules module = __import __ (module_name, globals(), locals(), [module_name.split ('.') [- 1]]) AttributeError: el objeto 'module' no tiene atributo 'split' " – Freshollie

+0

' module_name' es una cadena, prueba 'list_modules ('random')' en su lugar (aunque 'random' no tiene submódulos por lo que no será interesante). – ezod