Bonjour ,
J'aimerais savoir svp l'utilité du fihier init.py contenant 2 ou 3 lignes de codes , (import)
aussi a chaque developpement python , faut il créer un environnement virtuel ou c'est crée directement par python ? y a t-il une difference entre windows et linux en dev ?
# des bouts de reponses
Posté par NeoX . Évalué à 1.
j'ai pas la reponse pour tout, mais pour celle là :
oui et non.
oui quand tu va vouloir faire des fenetres, gerer la souris/clavier ou des acces à des fichiers c:\documents\utilisateurs\ sous windows, qui serait /home/utilisateurs/ sous linux.
non quand tu vas developper juste pour un programme en ligne de commande.
[^] # Re: des bouts de reponses
Posté par Maxime (site web personnel) . Évalué à 2.
Et quelles sont ces différences ? Même en graphique, je vois pas trop ce que ça change.
[^] # Re: des bouts de reponses
Posté par NeoX . Évalué à 1.
en graphique je ne sais pas trop, mais j'imagine qu'il y a surement des differences.
et en acces aux fichiers, ben les chemins sous windows ressemblent à
c:\documents\utilisateur\monfichier.txt
alors que ce sera
/home/utilisateur/monfichier.txt sous linux
[^] # Re: des bouts de reponses
Posté par Maxime (site web personnel) . Évalué à 2.
J'ai développé plusieurs applications graphiques avec PyQt et je n'ai pas remarqué de différence, le code est portable tel quel. Donc tu affirmes des choses sans savoir…
Au niveau du chemin, qu'est-ce que ça change ? Dans les deux cas, tu demandes à l'utilisateur le chemin et tu le mets dans une variable. Pour récupérer des dossiers précis, il y a des fonctions prévues pour ça.
# Tonton python
Posté par GuieA_7 (site web personnel) . Évalué à 1.
Fichier
__init__
:Ce fichier est présent dans tous les répertoires qui doivent être identifiés comme des modules python (je crois qu'on peut s'en passer dans les dernières versions de Python3).
Imaginons tu aies un un module de dessin
gfx.py
; avec le temps celui-ci grossit pas mal et tu veux le découper ; tu crées alors un répertoiregfx/
dans lequel tu mets un__init__.py
, et les autres fonctionnalités découpées (circle.py
,square.py
…). Le code présent dans__init__.py
sera exécuté dès lors que tu vas faire unimport gfx
Si tu veux accéder au code de dessin tu pourras faire (entre autres):
L’intérêt de mettre un
from square import Square
dansgfx/__init__.py
c'est de pouvoir écrire directement :L'idée étant de remonter les symboles les plus utiles par exemples, mais ce n'est pas du tout obligatoire.
Je ne suis pas sûr de comprendre la question. De base Python va utiliser l'environnement de ton shell, et va alors chercher les libs installées par ta distro (ou 'pip' lancé sans virtualenv). Le problème c'est quand les libs fournies par ta distro n'ont pas la version que tu souhaites ; ou pire que tu veux faire cohabiter des softs utilisant des versions différentes des mêmes libs. Du coup ça dépend que ce que tu veux !
Si tu veux utiliser/suivre les versions des libs de ta distro (pour être inclus un jour dedans par exemple), ben tu ne vas pas utiliser de virtualenv pour ton soft. Si tu t'en tapes et que tu veux des versions plus récentes, alors oui un virtualenv sera sûrement indiqué (histoire de ne pas foutre la grouille dans ton système). Et si tu distribues ton soft, donne au moins le moyen d'installer les bonnes versions des libs (fichier
requirements.txt
que tu peux donner directement à manger à pip).Il me semble que faire des virtualenv sous windows est encore un peu compliqué, mais que ça évolue dans le bon sens. Et sous windows il faudra un peu de taff pour avoir un shell/terminal de qualité ; de plus, en pratique un certain nombre de packages Python ne sont pas testés sous windows, ou ne marche pas du tout avec (mais ce n'est pas une majorité hein).
# Gestion de paquet
Posté par Ife . Évalué à 1.
__init__.py
est un fichier qui défini des paquets python.Par exemple, si ta structure de répertoires ressemble à ça :
Et que tu lance python dans le répertoire
.
.Maintenant, si ta structure de répertoire ressemble à ça :
Tu peux faire :
Le fichier
__init__.py
sera le racine de ton paquet. Par exemple :À la question « pourquoi avoir des import dans ce fichier? » En général c'est pour rendre disponible des fonction/classes qui sont enfoncées profondément dans ton paquet, et les rendre disponible à la racine.
Comme ceci (
NOQA
est un commentaire très souvent utilisé pour éviter que pyflakes ne signale les import inutiles) :Ruby est le résultat d'un gamin qui apprend le Java, puis jette un œil à Perl et se dit « je peux le réparer! »
# précisions
Posté par kernelox . Évalué à 1.
Bonjour , merci bcp pour vos retours , par contre je me sens encore novice .
J'explique conceretement mon cas :
J'ai mon code principale blabla.py dans un répértoire nommé code , blabla.py herite d'un "module"complement.py .. , pour moi un fichier.py dont on herite est un module (corrige moi si c'est faux )
donc comment dois-je placer les .py et que dois-je mettre dans le init.py pour que ça marche et que dois-je mettre dans mon répértoire code ?
merci
pythonement :)
[^] # Re: précisions
Posté par NeoX . Évalué à 2.
peut-etre en regardant d'autres codes python ?
c'est l'avantage de l'opensource, tu peux voir comment font les autres projets.
sinon des reponses precedentes, il ressort que tu peux faire
blabla.py
complements.py
dans le meme dossier,
tant que complements n'est pas trop gros, trop decoupés.
plus tard si complements.py devient trop complexe, tu voudras le decouper en morceau,
tu feras alors un dossier complements
qui contiendra les morceaux ET le init.py qui decrira ce qu'il y a dans le dossier
permettant alors de faire un simple
from complements import morceau1
[^] # Re: précisions
Posté par totof2000 . Évalué à 2.
Il faudrait penser à cesser cette façon d'importer vos fonctions/modules. Pensez que d'autres auront un jour à maintenir vos développements: Certes, écrire un truc du genre nom_paquet.fonction ou nom_paquet.Objet est un peu lourd mais on y gagne énormément en clarté lorsqu'on doit débugger/modifier un programme : on sait facilement ou chercher.
[^] # Re: précisions
Posté par NeoX . Évalué à 2.
et du coup, dans notre exemple ici, ca donnerait quoi ?
[^] # Re: précisions
Posté par totof2000 . Évalué à 3. Dernière modification le 08 juin 2015 à 11:23.
Un truc du genre :
et a l'appel :
[^] # Re: précisions
Posté par NeoX . Évalué à 2.
merci
# supposons que .
Posté par kernelox . Évalué à 1.
supposons que les compléments ( compelement1.py , complément2.py ….) ne soient pas dans le meme dossier que mon code originale (blabla.py ) :
dans : /home/code/ : j'ai blabla.py .
dans /home/complementcode/ : j'ai les compléments.py (comlement1, complément2 …) .
- Je met par exemple un fichier _init_.py dans le dossier complementcode dans lequel j'emporte tous les fichier complement1.py …
from complementcode import complement1
from complementcode import complement2
et dans le dossier code j'ajoute un fichier _init_.py dans le quel je met :
from /home/complementcode/ import /home/complementcode/ ??
merci
[^] # Re: supposons que .
Posté par NeoX . Évalué à 2.
je ne code pas en python, mais je dirais oui pour le "complement", ca devient un module, un package
et non pour le code, c'est directement dans le code que tu va importer le complement
suivi d'aller voir les examples de la documentation.
[^] # Re: supposons que .
Posté par GuieA_7 (site web personnel) . Évalué à 1.
Si tu es un novice en programmation tout court, je te conseillerai dans un premier de ne pas chercher à découper ton code en plusieurs fichiers, et plutôt à comprendre les notions fondamentales (variables, types, structures de contrôle, classes, fonctions …), quitte à d'abord tout mettre dans un seul fichier. De toutes les façons tes premiers programmes seront très simples, et tu ne vas pas te lancer dans quelques chose de trop ambitieux sans avoir bien compris les bases.
Mais bon revenons à ta question, qui nécessite quelques explications préliminaires:
Lorsque tu fais
import foo
, 'foo' doit être :Pour connaître les chemins où va chercher python tu peux faire dans une console python:
En fait le problème du point 2, c'est qu'un de tes propres fichiers peut masquer un module standard (ex: tu crées un fichier 'math.py'). C'est pourquoi à partir de Python3, la façon 2 disparaît, et tu peux du coup faire :
Note que tu peux utiliser ce comportement en Python2 en mettant
from __future__ import absolute_import
au début de tes fichiers.Attention si tu veux utiliser des imports relatifs ('from .math import ') tu devras lancer ton script avec l'option '-m' (et sans le '.py') pour le considérer comme un module.
Du coup pour ta question, et ben soit :
# recap
Posté par kernelox . Évalué à 1.
si j'ai bien compris en tout cas :
quand je crée un module et que je peux l'importer dans mon fichier courant qui contient mon code .py de base , le module doit :
être soit dans le dossier relatif a lib dans l'install python .
soit je peut mettre mon module dans le meme dossier que celui de mon code de base tout en ajoutant un fichier init.py qui indique le chemin vers ce module depuis l'arborscence .
exemple
dans home/code : j'ai code.py
je veux ajouter un module noté complément.py , donc je fais import complément dans code.py
puis dans le fichier init je met : from code import complément .
est ce exacte ..??
[^] # Re: recap
Posté par NeoX . Évalué à 3.
pourquoi veux-tu importer 2x ton complement ?
Relis bien chacune de nos reponses, va eventuellement lire le manuel de python qui t'en dira plus sur l'art et la maniere de coder en python.
tu as bien compris que le init.py devait son existence uniquement quand le "module" est un dossier contenant plusieurs complements ?
donc aujourd"hui avec juste
code.py
complement.py
tu n'as pas besoin de init.py
tu fais juste
from complement import foo
dans toncode.py
# foo
Posté par kernelox . Évalué à 1.
foo c'est quoi ça ? un module spécifique ??
merci pour ta dernière réponse
[^] # Re: foo
Posté par NeoX . Évalué à 2.
un truc par defaut, pour dire d'importer tout le module.
mais qui visiblement peut etre simplifier en
import complements
ou
complements.morceau1()
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.