Python не может найти недавно установленный модуль

#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 .