#python #pip #python-module
#python #pip #python-module
Вопрос:
Я создал модуль, используя следующее setup.py
# -*- coding: utf-8 -*-
# Learn more: https://github.com/kennethreitz/setup.py
from setuptools import setup, find_packages
with open('README.md') as f:
readme = f.read()
with open('LICENSE') as f:
license = f.read()
setup(
name='mymod',
version='1.0a1',
description='test',
long_description=readme,
long_description_content_type="text/markdown",
author='Ray Salemi',
author_email='ray@raysalemi.com',
url='https://rayboston@bitbucket.org/rayboston/mymod',
license=license,
packages=find_packages(exclude=('tests', 'docs', 'examples'))
)
Но когда я пытаюсь установить его с помощью
% python setup.py install
Я вижу, что он устанавливается в пакетах моего сайта:
Processing mymod-1.0a1-py3.8.egg
Copying mymod-1.0a1-py3.8.egg to /Users/raysalemi/PycharmProjects/testenv/lib/python3.8/site-packages
Adding mymod 1.0a1 to easy-install.pth file
Installed /Users/raysalemi/PycharmProjects/testenv/lib/python3.8/site-packages/mymod-1.0a1-py3.8.egg
Processing dependencies for mymod==1.0a1
Finished processing dependencies for mymod==1.0a1
(testenv) (base) raysalemi@WriteNow mymod % cd ../testenv
(testenv) (base) raysalemi@WriteNow testenv % python
Python 3.8.3 (default, Jul 2 2020, 11:26:31)
[Clang 10.0.0 ] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import mymod
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'mymod'
Как мне это отладить? Я не вижу ошибки.
Я использую Big Sur 11.0.1 и Python 3.8.3 от Anaconda
Pip показывает, что модуль есть
Package Version
---------- -------
pip 20.3.1
mymod 1.0a1
setuptools 41.2.0
Проблема в том, что имя пакета неверно:
(testenv) (base) raysalemi@WriteNow site-packages % ls
__pycache__ mymod-1.0a0-py3.8.egg
easy-install.pth mymod-1.0a0.dist-info
easy_install.py setuptools
pip setuptools-41.2.0.dist-info
pip-20.3.1.dist-info src
pkg_resources
Это mymod-1.0a0-py3.8.egg
вместо mymod
Комментарии:
1. Подождите, в
setup.py
вашем модуле вызываетсяmymod
, в вашем коде, который вы импортируетеmemos
, и сообщение об ошибке касается вызываемого модуляmemo
? Похоже, что автозамена изменяет имя модуля2. Это была ошибка автозамены. Мне пришлось переименовать фактическое имя модуля.
Ответ №1:
Для отладки вы можете запустить установку:
python setup.py sdist --formats=gztar
и распакуйте полученный .tar.gz
файл и проверьте, все ли ваши файлы исходного кода находятся в нем.
(или используйте --formats=zip
вместо gztar
, чтобы получить более простой файл для извлечения)
Результирующий пакет всегда имеет форму package_name-package_version
, поэтому полученное вами имя не является неправильным. (В случае, если вам интересно, вы можете найти действительные правила форматирования package_version здесь .)
Позже вы можете использовать этот пакет, добавив его в requirements.txt
файл проекта, от которого вы хотите зависеть. Например.
my-package>=1.2.0,<2.0.0
В вашем случае, поскольку версия является предварительной версией ( mymod-1.0a0-py3.8.egg
==> версия 1.0a0-py3.8.egg
, что означает версию 1.0
, предварительно обновленную версию alpha0-py3.8
).
Версия 1.0a0-py3.8.egg
<чем версия 1.0
(предварительная версия всегда < выпуск с тем же номером), поэтому вам понадобится что-то вроде >0,<2.0
.
Лично я помещаю исходный код в репозиторий, src/
а затем выбираю эти файлы в setup.py использование:
packages=find_namespace_packages(where="src")
Есть и другие параметры, которые я рекомендую использовать, например. убедитесь, что среда достаточно новая setuptools
для распознавания find_namespace_packages
, возьмите список зависимостей из requirements.txt
файлов и т. Д.:
from setuptools import setup, find_namespace_packages
with open('requirements.txt') as f:
required = f.read().splitlines()
setup(
name='your_project_name',
version='1.0.0',
description='your project description',
url='your repo url',
author='your username',
author_email='your email',
license='your license type',
package_dir={'': 'src'},
setup_requires='setuptools>=45.2.0',
packages=find_namespace_packages(where="src"),
install_requires=required,
data_files=['requirements.txt'],
include_package_data=True
)
Смотрите Полный список опций и для чего они предназначены в документации.
Ответ №2:
Я нашел свою проблему.
Мой исходный каталог был назван src
not mymod
. Итак src
, вместо каталога был site-packages
mymod
каталог. Это удивительно, поскольку пакет назван in setup.py
.