установить пип.создает только dist-info, а не пакет - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь создать пакет python, который я хочу установить, используя pip install . локально.Имя пакета указано в pip freeze, но import <package> приводит к ошибке No module named <package>.Также папка site-packages содержит только папку dist-info.find_packages() умеет находить пакеты.Чего мне не хватает?

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'
    ],

)

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Поскольку вопрос стал довольно популярным, вот шаги по диагностике, которые вы должны выполнить, если у вас нет файлов после установки.Представьте себе пример проекта со следующей структурой:

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

Теперь я запускаю pip install ., проверьте, установлен ли пакет:

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

, но не видите ни spam, ниspam/eggs.py, ни bacon.py, ни spam/fizz/buzz.py в списке файлов, принадлежащих установленному пакету:

$ 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

Что теперь делать?

Диагностика путем проверки журнала сборки колеса

Если не указано иное, pip всегда будет пытаться создать файл wheel и установить из него ваш пакет.Мы можем проверить журнал для процесса сборки колеса, если переустановить в подробном режиме.Первый шаг - удалить пакет:

$ pip uninstall -y mypkg
...

, затем установить его снова, но теперь с дополнительным аргументом:

$ pip install . -vvv
...

Теперь, если я проверяю журнал:

$ 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'

Я заметил, что нигде не упоминаются файлы из каталога spam или bacon.py.Это означает, что они просто не были включены в файл wheel и, следовательно, не были установлены pip.Наиболее распространенные источники ошибок:

Отсутствующие пакеты: проверьте аргумент packages

Убедитесь, что вы передали аргумент packages в функцию установки.Убедитесь, что вы упомянули всех пакетов, которые должны быть установлены.Подпакеты не будут собраны автоматически, если указан только родительский пакет!Например, в установочном скрипте будет установлен

from setuptools import setup

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

spam, но не spam.fizz, поскольку он сам является пакетом и должен быть явно указан.Исправление:

from setuptools import setup

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

Если у вас много пакетов, используйте setuptools.find_packages для автоматизации процесса:

from setuptools import find_packages, setup

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

В случае, если вам не хватает модуля:

Отсутствующие модули: проверьте аргумент py_modules

В приведенных выше примерах я пропущу bacon.py после установки, поскольку он не принадлежит ни одному пакету.Я должен указать имя модуля в отдельном аргументе py_modules:

from setuptools import find_packages, setup

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

Отсутствуют файлы данных: проверьте аргумент package_data

У меня есть все файлы исходного кода на месте, но файл data.txt все еще не установлен.Файлы данных, расположенные в каталогах пакетов, следует добавлять с помощью аргумента package_data.Исправление приведенного выше сценария установки:

from setuptools import find_packages, setup

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

Не пытайтесь использовать аргумент data_files.Поместите файлы данных в пакет и настройте package_data.

После исправления сценария установки убедитесь, что файлы пакета установлены после установки

Если я сейчас переустановлю пакет, я выполнюобратите внимание, что все файлы добавлены в колесо:

$ 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'

Они также будут видны в списке файлов, принадлежащих 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
0 голосов
/ 13 января 2019

Если вы работаете в Windows 10+, один из способов убедиться, что у вас установлены все правильные установки, - это нажать «Пуск» в нижнем левом углу, выполнить поиск cmd.exe и щелкнуть правой кнопкой мыши «Командная строка» (Убедитесь, что вы выбрали «Запуск от имени администратора»).Введите "CD path to your Python 3.X installation".Вы можете найти этот путь в проводнике (перейдите в папку, где установлен Python), а затем вверху.Скопируйте это и поместите туда, где я написал выше path to your Python 3.X installation.Как только вы это сделаете и нажмете ввод, введите «python -m pip install package» (package означает пакет, который вы хотите установить).Ваша программа на Python теперь должна работать идеально.

...