2009-12-28 10 views
2

J'ai écrit un petit script. Il est conçu pour rechercher dans le répertoire python tous les modules disponibles (qu'ils soient installés ou non), puis il est supposé vérifier quels modules sont actuellement chargés, puis il offre une option pour charger dynamiquement un module de votre choix. Ce dernier utilise __import__() parce que je lui passe une chaîne - (c'est là que j'ai un problème - mais j'y reviendrai bientôt) ... puis il donne la possibilité de "parcourir" le module pour toutes ses classes, fonctions, etc. (en utilisant dir([module name]) ...).Je peux importer __import __() pour importer dynamiquement un module en python - Je sais que cette cause n'apparaît pas dans sys.modules

Le problème:

Lorsque le module est chargé dynamiquement - il est intégré dans un communiqué try/except - si elle réussit, il signale que le « module est chargé » et si elle échoue, elle rapporte ... duh ... "Impossible de charger ..."

Si vous tapez le nom d'un module, par exemple un module nommé "uu", il est dit "chargé". Donc, je sais qu'il est en charge - cependant, quand je reviens appeler la fonction qui vérifie tous les modules CHARGÉS - il est vide (en utilisant sys.modules)

Je pense que python charge le module dans un endroit temporaire qui n'est pas sys.modules parce que quand je sors du script et vérifie sys.modules il n'est pas là.

+0

coller le script ici pas le lien de pâte –

+0

Ce script est trop long pour mettre directement dans la question. –

+0

Je ne peux pas coller le script entier - gs a raison, c'est trop long. Mais, ce n'est pas un long script que je promets: P. Je ne sais pas quelles parties sont assez importantes pour coller pour illustrer le problème ... mais je peux essayer de résumer: Essentiellement, il se lit comme ceci: var1 = raw_input ("Quel est le nom du module que vous voulez charger? : ") __import __ (var1) puis je le vérifie avec sys.modules PENDANT QUE LE SCRIPT EST EN COURS, - qui imprime une liste LONGUE de tous les modules qui sont chargés, mais le var1 (nom du module) n'est pas dans cette liste - et oui, je sais qu'il est en cours de chargement et est orthographié correctement: P. –

Répondre

1

Nascent_Notes, joli script! J'ai essayé de charger uu (commande 3) et d'imprimer la liste des modules chargés (commande 2) et ils semblent tous deux fonctionner correctement.

Cependant, si j'essaie de "parcourir le module" (commande 4), je reçois l'erreur suivante:

HlpWiz>>> 4 
What module do you want to look more into?: uu 

*An error occurred - probably because the module isn't loaded or is misspelled* 

Essayez d'exécuter

#!/usr/bin/env python 
import sys 
__import__('uu') 
print(sys.modules['uu']) 
print(dir(uu)) 

Vous devriez obtenir NameError: name 'uu' is not defined.

Il semble donc que bien __import__ importe des succès du module uu, il n'ajoute pas uu à l'espace de noms global - le module uu ne peut pas être accessible par le nom de la variable uu. Il est accessible par sys.modules cependant:

Par conséquent, changer

var_mod = input("What module do you want to look more into?: ") 
    print "\n attempting to browse... please wait!" 
    time.sleep(2) 
    browse_mod(zlib = var_mod) 

à

var_mod = raw_input("What module do you want to look more into?: ") 
    print "\n attempting to browse... please wait!" 
    time.sleep(2) 
    browse_mod(zlib = sys.modules[var_mod]) 

Non seulement utilise raw_input beaucoup plus sûr que input (l'utilisateur ne sera pas en mesure d'exécuter inattendue/commandes malveillantes), mais aussi raw_input fait ce que vous voulez ici.

Sur une note mineure, vous pouvez également changer

i = 1 
for line in sample: 
    print i, line 
    i = i + 1 

au plus pythonique

for i,line in enumerate(sample): 
    print i+1, line 

Modifier:

sys.modules est un dict (abréviation de dictionnaire) . Les dictons sont comme des annuaires téléphoniques - vous lui donnez un nom (mieux connu sous le nom de «clé») et il renvoie un numéro de téléphone (ou plus généralement, une «valeur»).

Dans le cas de sys.modules, les clés sont des noms de module (chaînes). Les valeurs sont les objets du module eux-mêmes.

Vous accédez aux valeurs de la dict en utilisant la notation entre crochets. Donc, uu est juste une chaîne, mais sys.modules['uu'] est le module uu.

Vous pouvez lire l'histoire sur dicts ici: http://docs.python.org/tutorial/datastructures.html#dictionaries

+0

Merci qui a fonctionné comme un charme !! Vous êtes un dieu-envoyer!J'essayais des variantes de l'i + 1, j'ai essayé i ++ et ça n'a pas fonctionné - alors je me suis rabattu sur ce que je savais qui marcherait, je n'ai pas pensé à simplement mettre l'expression là où vous avez suggéré - merci! De plus, je savais que "input" était dangereux à utiliser, comme par pydocs, mais c'était la seule façon de l'obtenir pour ne pas définir la valeur assignée à la variable comme une chaîne - mais vous avez résolu cela en faisant sys. modules [var_mod] - que faire à "[]" faire? comment passe-t-il la corde? ou est-ce juste "d'ajouter" le module à sys.modules? - confus ...: P Merci btw! –

+0

@Nascent_Notes, j'ai ajouté quelques explications concernant sys.modules et dicts. J'espère que cela aide. – unutbu

+0

k duh - Im stupide lol désolé - ouais je sais dicts, je ne savais pas que sys.modules était un dict, donc je pensais que vous faisiez quelque chose de «spécial» - merci d'expliquer cela! M'a appris la valeur de type(): P. Espérons que cela aidera à l'avenir ... –

Questions connexes