Partage
  • Partager sur Facebook
  • Partager sur Twitter

importation de modules

    27 novembre 2010 à 17:03:19

    Bonjour, je suis débutant en python et j'ai une erreur d'importation, mais je ne sais pas pourquoi.
    J'ai 2 fichiers, ubchi3.py et cryptagefonct.py, et ils sont dans le même dossier.


    ubchi3.py :
    from math import ceil
    from random import randrange
    from cryptagefonct import *
    
    def main():
    	
    	print("Bienvenue dans le programme Ubchi, celui-ci va vous permettre de coder des messages pour discuter de façon sécurisé avec n'importe qui.\n")
    	
    	choix = input("Voulez-vous crypter(c) ou décrypter(d) un message ?\n")
    	test = (choix == "c") or (choix == "crypter") or (choix == "coder") or (choix == "d") or (choix == "decrypter") or (choix == "decoder")
    	
    	while choix != test :
    		print("Veuillez rentrer un mot valide")
    		choix = input("Voulez-vous crypter(c) ou decrypter(d) un message ?\n")
    	
    	if (choix == "c") or (choix == "crypter") or (choix == "coder") :
    		main()
    	elif (choix == "d") or (choix == "decrypter") or (choix == "decoder") :
    		decryptage()
    	else :
    		print("Erreur, le programme doit se fermer")
    	
    	
    	print("Merci d'avoir utiliser le programme Ubchi")
    	return 0
    
    if __name__ == "__main__":
    	main()
    



    et cryptagefonct.py :
    def main():
    	
    	#  importation des modules  #
    	from math import ceil
    	from random import randrange
    	
    	#  définition de fonctions  #
    	
    	def ponctuation(longueur_msg, message):
    		"""fonction qui enlève les espaces et les apostrophes dans le messages à crypté"""
    		n, message2 = 0, ""
    		while n < longueur_msg:
    			if ((ord(message[n]) != 32) and (ord(message[n]) != 39)):
    				message2 += message[n]
    			n += 1
    		message = message2
    		
    		longueur_msg = len(message)
    		message = message.lower()
    		return longueur_msg, message
    	
    	def lignes(longueur_cle, longueur_msg):
    		"""calcul le nombre de lignes"""
    		if (longueur_msg % longueur_cle) != 0 :
    			nbr_lignes = ceil(longueur_msg/longueur_cle)
    		else :
    			nbr_lignes = int(longueur_msg / longueur_cle)
    		return nbr_lignes
    	
    	def lettrealeat(nbrLettreAdd, message):
    		"""rajoute des lettres aléatoires pour combler les trous"""
    		n, longueur_msg = 0, 0
    		while nbrLettreAdd != 0 :
    			x = chr(randrange(97, 123))
    			message += x
    			longueur_msg = len(message)
    			nbrLettreAdd = (nbr_lignes * longueur_cle)-longueur_msg
    		n += 1
    		return longueur_msg, message
    	
    	
    	
    	#  Programme  #
    	
    	n, i = 0, 0  #  compteur divers
    	x = ""
    	message2 = ""
    	tableau = []  #  variable essentielle, la plus intéressante
    	
    	cle = input("Veuillez entrer la clé de cryptage : ")
    	
    	message = input("Veuillez entrer le message à crypter : ")
    	
    	longueur_msg = len(message)
    	longueur_cle = len(cle)
    	
    	while longueur_cle > longueur_msg :
    		print("La longueur de la clé doit être inférieure à celle du message")
    		cle = input("Veuillez entrer la clé de cryptage : ")
    		message = input("Veuillez entrer le message à crypter : ")
    		longueur_msg = len(message)
    		longueur_cle = len(cle)
    	
    	longueur_msg, message = ponctuation(longueur_msg, message)
    	
    	nbr_lignes = lignes(longueur_cle, longueur_msg)
    	
    	nbrLettreAdd = (nbr_lignes * longueur_cle)-longueur_msg
    	
    	longueur_msg, message = lettrealeat(nbrLettreAdd, message)
    	
    	print("Le message à crypter est : " + message)
    	
    	n = 0
    	while n < longueur_cle :
    		tableau.append([])
    		n += 1
    	
    	n = 0
    	while n < longueur_msg :
    		i = 0
    		while i < longueur_cle :
    			tableau[i].append(message[n+i])
    			i += 1
    		n += longueur_cle
    	
    	n, i = 0, 0
    	transition = []
    	
    	while n < longueur_cle :
    		transition.append([])
    		transition[n] = ord(cle[n])
    		n += 1
    	
    	n = 0
    	
    	while i < longueur_cle :
    		n = 0
    		while n < longueur_cle-1 :
    			if transition[n] > transition[n+1] :
    				memoire1 = transition[n]
    				memoire2 = tableau[n]
    				transition[n] = transition[n+1]
    				tableau[n] = tableau[n+1]
    				transition[n+1] = memoire1
    				tableau[n+1] = memoire2
    			n += 1
    		i += 1
    	
    	n, i = 0, 0
    	message = ""
    	
    	while n < longueur_cle :
    		i = 0
    		while i < nbr_lignes :
    			message += str(tableau[n][i])
    			i += 1
    		n += 1
    	n, i = 0, 0
    	
    	print("Le message crypté est : " + message)
    	return 0
    	
    if __name__ == "__main__":
    	main()
    


    J'ai suivi le tuto officiel et normalement ça devrait marcher, les deux fichiers étant dans le même dossier.
    De plus, ça ne fonctionne toujours pas si je rajoute au début du fichier ubchi3.py:
    import sys
    sys.path.append('/chemin/vers/cryptagefonct.py')
    


    Le plus bizarre, c'est que ça marche avec d'autre fichiers, j'ai testé, mais là, je ne vois pas l'erreur, si quelqu'un pouvait m'aider, ça serais sympa.
    • Partager sur Facebook
    • Partager sur Twitter
      27 novembre 2010 à 17:28:29

      Ce serait bien si tu postais le message d'erreur..

      Une possible cause d'erreur est le fait que ton fichier cryptagefonct.py possède une fonction main. Donc quand tu fais from cryptagefonct import *, tu importes une nouvelles fonction main dans ton namespace, ce qui peut provoquer des conflits.

      A verifier..
      • Partager sur Facebook
      • Partager sur Twitter
        27 novembre 2010 à 17:33:46

        sys.path.append('/chemin/vers/cryptagefonct.py')
        Il ne vaudrait pas mieux indiquer le chemin du répertoire sys.path.append('/chemin/vers/') et non pas vers le fichier .py ? Et oui, il faut un __init__.py, même vide, dans le dossier.
        • Partager sur Facebook
        • Partager sur Twitter
          27 novembre 2010 à 17:35:04

          J'ai mis une fonction main dans cryptagefonct.py ensuite, j'avais déjà testé sans.

          et pour l'erreur :
          $ python3.1 ubchi3.py 
          Traceback (most recent call last):
            File "ubchi3.py", line 33, in <module>
              from cryptagefonct import *
          ImportError: No module named cryptagefonct


          EDIT: Le fait d'indiquer le dossier parent et non le fichier .py ne change rien.
          Par contre, je suis le tuto officiel et j'en suis à la fin de la partie II, donc je sais pas vraiment ce qu'est un __init__.py
          merci pour vos réponses.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            27 novembre 2010 à 17:49:55

            Un __init__.py, ça permet d'importer sans problèmes en fait, tu le mets et ça devrait marcher.
            Et il faut mettre le dossier parent avec dedans le cryptagefonct.py, le __init__.py et le ubchi3.py
            • Partager sur Facebook
            • Partager sur Twitter
              27 novembre 2010 à 18:02:28

              D'accord, mais je met quoi dans le __init__.py ?
              rien?
              EDIT: ça ne marche toujours pas.
              • Partager sur Facebook
              • Partager sur Twitter
                27 novembre 2010 à 18:16:30

                Rien.
                Édit : Bah ça devrait marche, soit tu as raté quelque chose, soit c'est un bug. Mais je crois peu au bug. Tu peux dire comment tu as disposé tes fichiers, dans quels dossiers, le sys.path.append effectué, tout ça ?
                • Partager sur Facebook
                • Partager sur Twitter
                  27 novembre 2010 à 18:30:31

                  Bah, en fait, j'aime bcp les dossiers :
                  /home/sirius/Documents/tpe/ubchi3/
                  et dans ubchi3, il y a :
                  cryptage.py(une ancienne version qui ne sert plus, j'ai essayer en la virant du dossier, ça change rien), cryptagefonct.py, __init__.py, __init__.pyc, ubchi3.py.

                  Pour le sys.path, j'ai essayé de mettre ça avant les from import :
                  import sys
                  sys.path.append('/home/sirius/Documents/tpe/ubchi3/cryptagefonct.py') # avec et sans le .py

                  J'ai aussi éssayé en important __init__ etsans l'importer.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 novembre 2010 à 18:37:23

                    sys.path.append('/home/sirius/Documents/tpe/ubchi3/') seulement.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 novembre 2010 à 18:40:31

                      Tu veux dire qu'il ne faut pas mettre la ligne "import sys" ?
                      Pourtant, je me suis reporter à :

                      Citation : entwanne

                      Mon module module_inexistant étant dans le répertoire /repertoire/parent/de/mon/module , je l'ajoute :
                      Code : Python - Sélectionner
                      >>> import sys
                      >>> sys.path.append('/repertoire/parent/de/mon/module')
                      >>> import module_inexistant
                      >>> module_inexistant.func()
                      42



                      sur le post-it des erreurs.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        27 novembre 2010 à 18:54:06

                        Essaye les étapes suivantes dans l'ordre:

                        1) vérifie que le nom de ton fichier cryptagefonct.py est correctement orthographié quand tu importes (typiquement, vérifie que tu n'as pas mis de majuscule au "f", etc...). Ça peut paraître idiot, mais c'est le genre de truc con qui arrive.

                        2) ouvre un interpréteur python dans le dossier concerné, et essaie d'importer ton module. En particulier, essaie la syntaxe:
                        import cryptagefonct
                        

                        au lieu de
                        from cryptagefonct import *
                        


                        Si ça ne marche pas... et ben on essaiera autre chose..

                        EDIT: Bon, j'ai testé sur mon mac, avec python 2.6, et l'importation ne plante pas. J'ai collé copié collé ton code dans deux fichiers ubchi.py, et cryptagefonct.py, tous les deux sur mon bureau (sans __init__.py), et ça a marché nikel. J'insiste sur le fait que tu devrait vérifier que les noms de tes fichiers correspondent à ce que tu veux importer.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        importation de modules

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown