Salut,
Si "import" ne fonctionnait pas non seulement çà se saurait mais votre code aurait planté bien plus tôt.
La première chose à vérifier est que la consistance du message d'erreur: s'il ne trouve pas le fichier translations.py dans pyFMM... vérifier s'il y est ou pas ne coûte pas cher mais il n'y a que vous à pouvoir le faire.
L'étape suivante serait de vérifier que l'import fonctionne depuis la console (i.e. hors IDE, hors application).
Une cause probable serait que le répertoire pyFMM dans lequel vous avez construit tout ou partie de l'arborescence de votre application soit en conflit avec le "bon" pyFMM.
- W
Le fichiers translations.py est bien présent comme on peut le voir dans l'impression écran du message d'origine, où dans :
J'ai tenté avec la console sans succés!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 @Ellington:~/Dropbox/Stage/Code_FMM/python_code/pyfmm-read-only$ ls pyFMM/Kernels/ __init__.py translations.py laurent@Ellington:~/Dropbox/Stage/Code_FMM/python_code/pyfmm-read-only$
Si quelqu'un accepte de télécharger le module pour vérifier que ça marche pour lui ce serait super sympas:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 python_code/pyfmm-read-only/pyFMM$ python FastMultipole/fastMultipoleMethod.py Traceback (most recent call last): File "FastMultipole/fastMultipoleMethod.py", line 6, in <module> from pyFMM.Kernels.translations import * ImportError: No module named pyFMM.Kernels.translations
J'ai réalisé:
svn checkout http://pyfmm.googlecode.com/svn/trunk/ pyfmm-read-only sur http://code.google.com/p/pyfmm/wiki/HowToPyFMM
ce qui m' a créé un dossier pyfmm-read-only avec tous les fihiers. Puis j'ai ouvert python (avec spyder) et tenté de lancer translatins.py (pas de pbm), quadtree.py (pas de pbm) mais pour mais pour FastMultipoleMethod.py ça nefonctionne pas...
Ah je crois que c'est une histoire de variable d'environnement:
Si quelqu'un peut m' expliquer.. (je suis débutant en informatique donc avec des mots simples)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 After downloading (and extracting) the latest version of the code, you need to add the folder of the package to the PYTHONPATH system variable, e.g.: Let suppose that the final folder is /Users/user/pyFMMv1.X.X export PYTHONPATH=${PYTHONPATH}:/Users/user/pyFMMv1.X.X
Salut,
Ça n'a rien de compliqué, ton script ne peut importer que ce qu'il trouve dans le dossier où il se trouve et ses sous-dossiers. Ceux-ci ayant un fichier __init__.py comme ce semble être ton cas.
Mais en aucun cas Python ne remontera dans l'arborescence des dossiers pour rechercher ce que tu demandes.
Tu peux donc, à cette fin, ajouter un (des) chemin(s) avec sys.path.append('mon/chemin') mais la meilleure solution sera toujours que le script qui lance l'application soit dans le dossier root de celle-ci.
Merci j'ai essayé ta secode méthode (ie) de déplacer les dossier Kernels et DataStructure dans le dossier FastMultipole et c'est nickel!
Je ne comprends pas certaines parties de code, par exemple:
fac = lambda n: [1, 0] [n > 0] or fac(n - 1) * n
Qu'est ce que ça fait ? J'ai une fonction 'fa' qui n'est pas définit par la procdure habituelle mais utilise le mot clé lambda. J'imagine que le code signifie
* le "n:" signifie 'à n j'associe'
*"[1, 0] [n > 0]" là je ne capte pas (même si je m dute que ca traite les cas 0 et 1)
* "or fac(n - 1) * n" : definition recursive
Je ne comprends pas non plus:
1)
Que signifie: n = n >> 1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 def binToStr(n): '''convert a binary number to a binary string''' bStr = '' while n > 0: bStr = str(n % 2) + bStr n = n >> 1 return bStr
2) Je pensais que ce ode me donait la version binaire d'un nombre n \in [0,1] avec une précision :level.Mais c'est faux car pour
toBinStr(1,2)
Out[83]: '11'
0.5 alors
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 def toBinStr(n, level): ''' Convert a float to a binary string''' bStr='' if n < 0 or n > 1 : raise ValueError, 'number must be between [0,1]' if level < 0: raise ValueError, 'level must be a positive integer' levelcount = 0 boxsize = 1.0 while levelcount < level: boxsize = boxsize / 2 if n > boxsize: bStr = bStr + '1' n = n - boxsize else: bStr = bStr + '0' levelcount = levelcount + 1 return bStr
le mot-clé lambda permet de définir une fonction anonyme, dont le corps est constitué d'une simple expression. C'est équivalent à:
[1,0][n>0] est une liste indexée par un booléen; True correspond à l'indice 1 et False à l'indice 0. Donc si n > 0 est vrai, le résultat sera 0, sinon il sera 1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 def fac(n): return [1, 0] [n > 0] or fac(n - 1) * n
L'opérateur or renvoie la valeur de son premier argument s'il est évalué à vrai, sinon il évalue et renvoie le second. Ici c'est un peu l'inverse du cas précédent, où on utilisait un booléen dans un contexte où on attendait un entier; ici on utilise un entier (0 ou 1) dans un contexte où en attendrait un booléen. 0 est interprété comme False et toute autre valeur entière comme True.
Donc si le résultat de l'expression précédente était 1, donc si n <= 0, c'est la valeur 1 qui est retournée. Sinon (n>0), la valeur était 0 et le second argument du or est évalué, c'est à dire fac(n-1) * n.
Il pourrait sembler qu'on puisse simplifier ça en [1,fac(n-1) * n][n>0] mais cela causerait une boucle infinie d'appels (qui finirait par un "max recursion depth exceeded"), car tout reposait sur le fait que or n'évalue pas le second argument si le premier est vrai.
C'est une écriture idiomatique un peu archaïque; une écriture plus moderne serait:
ou simplement:
Code : Sélectionner tout - Visualiser dans une fenêtre à part fac = lambda n: fac(n-1) * n if n > 0 else 1
C'est un déclage vers la droite d'un bit. Cela correspond à une division entière par 2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 def fac(n): if n > 0: return fac(n-1) * n else: return 1
https://docs.python.org/2/reference/...ing-operations
Il ne renvoie que la parti fractionnelle
1 = 0.99999999...
Ou en binaire: 1 = 0.11111111111...
Donc c'est normal qu'il renvoie 11 si tu ne demandes que deux chiffres de précision.
0.5 en binaire donne 0.1 ou 0.0111111.... Ici c'est la seconde représentation à cause du n > boxsize. Si tu veux la première représentation, il faut remplacer > par >=.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager