67 votes

installer pip. crée uniquement les informations dist et non le package

J'essaie de créer un package python que je souhaite installer en utilisant pip install . localement. Le nom du package est répertorié dans pip freeze mais import <package> entraîne une erreur No module named <package> . Le dossier site-packages ne contient également qu'un dossier dist-info. find_packages() est capable de trouver des packages. Qu'est-ce que je rate?

 import io
import os
import sys
from shutil import rmtree

from setuptools import find_packages, setup, Command

# Package meta-data.
NAME = '<package>'
DESCRIPTION = 'description'
URL = ''
EMAIL = 'email'
AUTHOR = 'name'

# What packages are required for this module to be executed?
REQUIRED = [
    # 'requests', 'maya', 'records',
]

# The rest you shouldn't have to touch too much :)
# ------------------------------------------------
# Except, perhaps the License and Trove Classifiers!
# If you do change the License, remember to change the Trove Classifier for that!

here = os.path.abspath(os.path.dirname(__file__))



# Where the magic happens:
setup(
    name=NAME,
    #version=about['__version__'],
    description=DESCRIPTION,
    # long_description=long_description,
    author=AUTHOR,
    author_email=EMAIL,
    url=URL,
    packages=find_packages(),
    # If your package is a single module, use this instead of 'packages':
    # py_modules=['mypackage'],

    # entry_points={
    #     'console_scripts': ['mycli=mymodule:cli'],
    # },
    install_requires=REQUIRED,
    include_package_data=True,
    license='MIT',
    classifiers=[
        # Trove classifiers
        # Full list: https://pypi.python.org/pypi?%3Aaction=list_classifiers
        'License :: OSI Approved :: MIT License',
        'Programming Language :: Python',
        'Programming Language :: Python :: 2.6',
        'Programming Language :: Python :: 2.7',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.3',
        'Programming Language :: Python :: 3.4',
        'Programming Language :: Python :: 3.5',
        'Programming Language :: Python :: 3.6',
        'Programming Language :: Python :: Implementation :: CPython',
        'Programming Language :: Python :: Implementation :: PyPy'
    ],

)
 

88voto

hoefling Points 10709

Depuis que la question est devenue très populaire, voici les étapes de diagnostic pour aller à travers lorsque vous êtes absent de fichiers après l'installation. Imaginez avoir un exemple de projet avec la structure suivante:

root
├── spam
│   ├── __init__.py
│   ├── data.txt
│   ├── eggs.py
│   └── fizz
│       ├── __init__.py
│       └── buzz.py
├── bacon.py
└── setup.py

Maintenant je gère pip install ., vérifiez que le paquet est installé:

$ pip list
Package    Version
---------- -------
mypkg      0.1    
pip        19.0.1 
setuptools 40.6.3 
wheel      0.32.3 

mais voir ni spamni spam/eggs.py ni bacon.py ni spam/fizz/buzz.py dans la liste des fichiers appartenant au paquet installé:

$ pip show -f mypkg
Name: mypkg
Version: 0.1
...
Files:
  mypkg-0.1.dist-info/DESCRIPTION.rst
  mypkg-0.1.dist-info/INSTALLER
  mypkg-0.1.dist-info/METADATA
  mypkg-0.1.dist-info/RECORD
  mypkg-0.1.dist-info/WHEEL
  mypkg-0.1.dist-info/metadata.json
  mypkg-0.1.dist-info/top_level.txt

Alors, que faire maintenant?

Le diagnostic par l'inspection de la roue journal de l'

Sauf a dit de ne pas le faire, pip toujours essayer de construire une roue de fichier et l'installer sur votre paquet d'elle. Nous pouvons inspecter le journal de la roue processus de construction si la réinstallation dans le mode verbose. La première étape consiste à désinstaller le package:

$ pip uninstall -y mypkg
...

puis l'installer à nouveau, mais maintenant, avec un argument supplémentaire:

$ pip install . -vvv
...

Maintenant, si je inspecter le journal:

$ pip install . -vvv | grep 'adding'
  adding 'mypkg-0.1.dist-info/METADATA'
  adding 'mypkg-0.1.dist-info/WHEEL'
  adding 'mypkg-0.1.dist-info/top_level.txt'
  adding 'mypkg-0.1.dist-info/RECORD'

Je remarque qu'aucun des fichiers à partir de l' spam répertoire ou bacon.py sont mentionnés nulle part. Cela signifie qu'ils n'étaient tout simplement pas inclus dans la roue de fichier et donc il n'est pas installé par pip. L'erreur la plus fréquente de sources sont:

Les paquets manquants: vérifier l' packages argument

Vérifiez que vous avez passé l' packages argument à la fonction de configuration. Vérifiez que vous avez mentionné tous les paquets qui doivent être installés. Des sous-paquets ne seront pas collectées automatiquement si seulement le package parent est mentionné! Par exemple, dans le script d'installation

from setuptools import setup

setup(
    name='mypkg',
    version='0.1',
    packages=['spam']
)

spam seront installées, mais pas spam.fizz parce que c'est un package lui-même et doit être mentionné explicitement. En le fixant:

from setuptools import setup

setup(
    name='mypkg',
    version='0.1',
    packages=['spam', 'spam.fizz']
)

Si vous avez beaucoup de paquets, utilisez setuptools.find_packages pour automatiser le processus:

from setuptools import find_packages, setup

setup(
    name='mypkg',
    version='0.1',
    packages=find_packages()  # will return a list ['spam', 'spam.fizz']
)

Dans le cas où il vous manque un module:

Les modules manquants: vérifier l' py_modules argument

Dans les exemples ci-dessus, je vais être absent bacon.py après l'installation, car il n'appartient pas à un paquet. - Je fournir ses nom du module dans l'argument séparé py_modules:

from setuptools import find_packages, setup

setup(
    name='mypkg',
    version='0.1',
    packages=find_packages(),
    py_modules=['bacon']
)

Manquant de fichiers de données: vérifier l' package_data argument

J'ai tous les fichiers de code source maintenant en place, mais l' data.txt le fichier n'est pas encore installé. Les fichiers de données situé sous répertoires de paquets doivent être ajoutés par le biais de l' package_data argument. La fixation de la configuration ci-dessus script:

from setuptools import find_packages, setup

setup(
    name='mypkg',
    version='0.1',
    packages=find_packages(),
    package_data={'spam': ['data.txt']},
    py_modules=['bacon']
)

Ne soyez pas tenté d'utiliser l' data_files argument. Placez les fichiers de données sous un paquet et configurer package_data à la place.

Après fixation du script d'installation, vérifiez que les paquets sont en place après l'installation

Si j'ai maintenant réinstaller le paquet, j'ai remarquerez que tous les fichiers sont ajoutés à la roue:

$ pip install . -vvv | grep 'adding'
  adding 'bacon.py'
  adding 'spam/__init__.py'
  adding 'spam/data.txt'
  adding 'spam/eggs.py'
  adding 'spam/fizz/__init__.py'
  adding 'spam/fizz/buzz.py'
  adding 'mypkg-0.1.dist-info/METADATA'
  adding 'mypkg-0.1.dist-info/WHEEL'
  adding 'mypkg-0.1.dist-info/top_level.txt'
  adding 'mypkg-0.1.dist-info/RECORD'

Ils seront également visibles dans la liste des fichiers appartenant à d' mypkg:

$ pip show -f mypkg
Name: mypkg
Version: 0.1
...
Files:
  __pycache__/bacon.cpython-36.pyc
  bacon.py
  mypkg-0.1.dist-info/INSTALLER
  mypkg-0.1.dist-info/METADATA
  mypkg-0.1.dist-info/RECORD
  mypkg-0.1.dist-info/WHEEL
  mypkg-0.1.dist-info/top_level.txt
  spam/__init__.py
  spam/__pycache__/__init__.cpython-36.pyc
  spam/__pycache__/eggs.cpython-36.pyc
  spam/data.txt
  spam/eggs.py
  spam/fizz/__init__.py
  spam/fizz/__pycache__/__init__.cpython-36.pyc
  spam/fizz/__pycache__/buzz.cpython-36.pyc
  spam/fizz/buzz.py

0voto

Arnav Poddar Points 380

Si vous êtes sur Windows 10+, une façon pour vous de assurez-vous que vous avez eu toutes les installations de cliquer sur démarrer dans le coin inférieur gauche et de recherche cmd.exe et cliquez-droit sur "Invite de Commande" (assurez-vous de choisir "Exécuter en tant qu'Administrateur"). Tapez "cd path to your Python 3.X installation". Vous pouvez trouver ce chemin dans l'Explorateur de Fichiers (allez dans le dossier où Python est installé), puis en haut. Ce copier, et de le mettre dans l'endroit où je l'ai écrit ci-dessus path to your Python 3.X installation. Une fois que vous avez et cliquez sur entrée, tapez "python -m pip install package" (package signifie que le paquet que vous voulez installer). Votre programme en Python devrait maintenant fonctionner parfaitement.

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