39 votes

Pouvons-nous jeter un peu de lumière définitive sur la façon python de conditionnement et d'importation des œuvres?

J'ai eu ma chance de passer à travers le python de gestion de modules, et chaque fois, c'est un défi: l'emballage n'est pas ce que les gens font tous les jours, et il devient un fardeau pour apprendre, et un fardeau pour rappelez-vous, même quand vous avez réellement le faire, puisque cela arrive normalement qu'une fois.

Je voudrais recueillir ici définitive aperçu de la façon dont l'importation, la gestion des paquets et des ouvrages de distribution de python, de sorte que cette question devient l'explication définitive pour toute la magie qui se passe sous le capot. Même si je comprends le niveau général de la question, ces choses sont tellement imbriqués qu'une réponse ne résoudra pas le problème principal: comprendre comment tout fonctionne, ce qui est obsolète, ce qui est courant, ce sont juste des solutions de rechange pour la même tâche, ce sont les bizarreries.

La liste de mots-clés à consulter est la suivante, mais c'est juste un exemple de la grappe. Il y en a beaucoup plus et vous êtes les bienvenus pour ajouter des détails supplémentaires.

  • PyPI
  • setuptools / Distribuer
  • distutils
  • les œufs
  • oeuf-lien
  • pip
  • zipimport
  • site.py
  • site-packages
  • .la pth fichiers
  • virtualenv
  • la manipulation des modules compilés dans les oeufs (avec et sans installation via easy_install)
  • l'utilisation de get_data()
  • pypm
  • bento
  • PEP 376
  • le fromage boutique
  • eggsecutable

Liens vers d'autres réponses est probablement une bonne idée. Comme je l'ai dit, cette question est pour la présentation de haut niveau.

11voto

Mike Steder Points 4309

Pour la plupart, c'est une tentative de regarder l'emballage, la distribution, le côté, pas la mécanique de l' import. Malheureusement, l'emballage est l'endroit où Python offre un moyen de plus d'une façon de le faire. Je suis juste essayer d'obtenir le roulement de boule, j'espère que d'autres de contribuer à combler ce qui me manque ou signaler des erreurs.

Tout d'abord il y a un peu de désordre de la terminologie ici. Un répertoire contenant un __init__.py le fichier est un ensemble. Cependant, la plupart de ce dont nous parlons ici sont des versions spécifiques de paquets publié sur PyPI, l'un des miroirs, ou dans un fournisseur de système de gestion de paquets comme Debian Apt, de Redhat Yum, Fink, Macports, Homebrew, ou ActiveState est pypm.

La publication de ces paquets sont ce que les gens essaient d'appeler des "Distributions" aller de l'avant dans une tentative d'utilisation de "Package" que comme le langage Python construire. Vous pouvez voir quelques-unes que l'utilisation de la PEP-376 PEP-376.

Maintenant, la liste de vos mots clés se rapportent à différents aspects de l'Python Écosystème:

Recherche et publication python distributions:

  • PyPI (aka le fromage boutique)
  • PyPI Miroirs
  • Divers outils de gestion de paquets / systèmes: apt, yum, fink, macports, homebrew
  • pypm (ActiveState l'alternative à PyPI)

Le ci-dessus sont tous les services qui fournissent un endroit pour publier des distributions Python dans divers formats. Certains, comme PyPI miroirs et apt / dépôts yum peut être exécuté sur votre ordinateur local ou au sein de votre réseau d'entreprises, mais les gens utilisent généralement l'officielles. La plupart, si pas tous, de fournir un outil (ou de plusieurs outils dans le cas de PyPI) pour aider à trouver et télécharger des distributions.

Les bibliothèques utilisées pour créer et installer des distributions:

  • setuptools / Distribuer
  • distutils

Distutils est la norme de l'infrastructure sur laquelle les paquets Python sont compilées et intégrées dans les distributions. Il y a une tonne de fonctionnalités en distutils , mais la plupart des gens connaissent:

from distutils.core import setup

setup(name='Distutils',
      version='1.0',
      description='Python Distribution Utilities',
      author='Greg Ward',
      author_email='gward@python.net',
      url='http://www.python.org/sigs/distutils-sig/',
      packages=['distutils', 'distutils.command'],
 )

Et dans une certaine mesure, c'est un plus de ce que vous avez besoin. Avec l'accord préalable et 9 lignes de code que vous avez suffisamment d'informations pour installer un pur paquet Python et aussi le minimum de métadonnées nécessaires pour publier le package de distribution sur PyPI.

Setuptools fournit les points d'ancrage nécessaires à l'appui de l'Œuf format et l'ensemble de ses fonctionnalités et ses défauts. Distribuer est une alternative à Setuptools qui ajoute quelques fonctionnalités tout en essayant d'être la plupart du temps compatible. Je crois Distribuer va être inclus dans Python 3 comme le successeur de Distutil de l' from distutils.core import setup.

Les deux Setuptools et Distribuer fournir une version personnalisée de l' distutils commande du programme d'installation qui ne fait que des choses utiles comme support de l'Œuf format.

Python Formats De Distribution:

Les Distributions sont généralement fournis soit en tant que source d'archives (archive ou zipfile). La méthode standard pour installer une distribution source est par le téléchargement et la décompression de l'archive, puis l'exécution de l' setup.py le fichier à l'intérieur.

Par exemple, pour télécharger, compiler et installer le Pygments de la syntaxe de la bibliothèque:

curl -O -G http://pypi.python.org/packages/source/P/Pygments/Pygments-1.4.tar.gz
tar -zxvf Pygments-1.4.tar.gz
cd Pygments-1.4
python setup.py build
sudo python setup.py install

Sinon, vous pouvez télécharger l'Œuf fichier et l'installer. Généralement ceci est accompli en utilisant easy_install ou pip:

sudo easy_install pygments
or 
sudo pip install pygments

Les œufs ont été inspirés par Java Jarfiles et ils ont quelques caractéristiques que vous devriez lire sur ici

Paquet Python Formats:

  • non compressé répertoires
  • zipimport (compressés zip répertoires)

Normal paquet python est simplement un répertoire contenant un __init__.py le fichier et un nombre arbitraire de modules supplémentaires ou des sous-packages. Python dispose également d'un support pour la recherche et le chargement de code source à l'intérieur *.les fichiers zip aussi longtemps qu'ils sont inclus dans l' PYTHONPATH (sys.path).

L'Installation De Paquets Python:

  • easy_install: l'origine de l'œuf de l'outil d'installation, dépend setuptools
  • pip: à l'heure actuelle le moyen le plus populaire pour installer les paquets python. Semblable à l' easy_install mais plus souple et a quelques fonctionnalités intéressantes comme les exigences de fichiers à l'aide du document de dépendances et de reproduire les déploiements.
  • pypm, apt, yum, fink, etc

La Gestion De L'Environnement / De Déploiement Automatisé:

  • bento
  • buildout
  • virtualenv (et virtualenvwrapper)

Les outils ci-dessus sont utilisés pour aider à automatiser et de gérer les dépendances d'un projet Python. Fondamentalement, ils vous donnent des outils pour décrire ce que les distributions de votre application et d'automatiser l'installation de ces versions spécifiques de vos dépendances.

Lieux de Paquets / Distributions:

  • site-packages
  • PYTHONPATH
  • le répertoire de travail courant (dépend de votre système d'exploitation et les paramètres de l'environnement)

Par défaut, l'installation d'une distribution python est d'aller le déposer dans le site-packages répertoire. Ce répertoire est généralement quelque chose comme /usr/lib/pythonX.Y/site-packages.

Un simple programmatique façon de trouver votre site-packages répertoire:

from distuils import sysconfig
print sysconfig.get_python_lib()

Des façons de modifier votre PYTHONPATH:

Python import trouverez uniquement les paquets qui sont situés dans l'un des répertoires inclus dans votre PYTHONPATH.

Vous pouvez consulter et modifier votre chemin à partir de l'intérieur de Python en accédant à:

import sys
print sys.path
sys.path.append("/home/myname/lib")

En outre, vous pouvez définir l' PYTHONPATH variable d'environnement comme vous le feriez de toute autre variable d'environnement de votre système d'exploitation, ou vous pouvez utiliser:

  • .la pth fichiers: *.la pth fichiers situés dans les répertoires qui sont déjà sur votre PYTHONPATH lecture de chaque ligne de l' *.la pth fichier est ajouté à votre PYTHONPATH. En fait toutes les fois que vous copiez un paquet dans un répertoire sur votre PYTHONPATH vous pouvez créer un mypackages.pth. Lire plus sur *.la pth fichiers: module du site
  • l'œuf de fichiers liens: structure Interne de python œufs qu'ils sont une plate-forme alternative aux liens symboliques. La création d'un œuf lien de fichier est similaire à la création d'une pth fichier.
  • site.py modifications

Pour ajouter la-dessus /home/myname/lib de site-packages avec un *.la pth fichier, vous devez créer un *.la pth fichier. Le nom du fichier n'a pas d'importance, mais vous devriez probablement choisir quelque chose de sensible.

Créons myname.pth:

# myname.pth
/home/myname/lib

C'est tout. Baisse, ce qui en sysconfig.get_python_lib() sur votre système ou tout autre répertoire de votre PYTHONPATH et /home/myname/lib sera ajouté au chemin d'accès.

3voto

number5 Points 3749

Pour l'emballage de question, cela devrait aider http://guide.python-distribute.org/

Pour l'importation, l'ancien article de Fredrik Lundh http://effbot.org/zone/import-confusion.htm encore un très bon point de départ.

2voto

Noe Nieto Points 552

Je recommande Tarek Ziadek Livre sur Python. Il y a un chapitre consacré à l'emballage et la distribution.

0voto

Ixmatus Points 591

Je ne pense pas qu' import doit être exploré (Python namespacing et de l'importation de la fonctionnalité est intuitif à mon humble avis).

J'utilise pip exclusivement maintenant. Je n'ai pas de problèmes avec elle.

Cependant, le sujet de l'emballage et de la distribution est quelque chose vaut la peine d'explorer. Au lieu de donner une réponse longue, je dirai ceci:

J'ai appris comment empaqueter et distribuer mon propre "packages" en copiant simplement comment Pylônes ou de nombreux autres open-source packages de le faire. J'ai ensuite combinées ce genre de modèle avec la lecture de la documentation de la chair il encore plus loin et sont venus avec une solide méthode de distribution.

Lorsque vous grok la gestion des paquets et de la distribution de python (distutils et pypi), c'est vraiment très puissant. Je l'aime beaucoup.

[modifier]

Je voulais aussi ajouter un peu sur virtualenv. L'UTILISER. J'ai créer un virtualenv pour chaque projet, et j'ai toujours utiliser --no-site-packages; j'ai installer tous les paquets dont j'ai besoin pour un projet en particulier (même si c'est quelque chose de commun entre eux tous, comme lxml) à l'intérieur de la virtualev. Il maintient le tout isolé et qu'il est beaucoup plus facile pour moi de maintenir le groupement dans ma tête (plutôt que d'essayer de garder une trace de ce qui est où et pour quelle version de python!)

[/edit]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X