Поскольку вопрос стал довольно популярным, вот шаги по диагностике, которые вы должны выполнить, если у вас нет файлов после установки.Представьте себе пример проекта со следующей структурой:
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