Персональный модуль PyPI не может быть импортирован другими пользователями или мной?

В настоящее время я работаю над довольно простым модулем Python и весь день пытаюсь опубликовать его на PyPI. Я делаю это впервые.

Я успешно создал его, используя python3 setup.py sdist bdist_wheel, затем сделал python3 -m twine upload --repository testpypi dist/* и twine upload dist/*, и он успешно загружен, как показано здесь. Однако, когда я или мои друзья это делают pip install manhattandistance, он устанавливает пакет, и когда я пытаюсь импортировать его, используя from manhattan distance import *, как показано в моем коде:

from manhattandistance import *
print(mandist(37.99438337141694, 23.732534940640544, 37.97163377228043, 23.72572774064004))

Однако написано, что Import "manhattan_distance" could not be resolved. Когда я пытаюсь переустановить его с помощью pip, он говорит, что он уже установлен, и когда я пробираюсь по этому пути, я замечаю, что установлен только .info, в то время как у других модулей есть 2 папки, одна с файлами внутри и одна для . Информация.

Скриншот из powershell:

Видите, что в моем модуле есть только выделенная папка .info?:

Я создал все необходимые файлы:

-manhattandistance
--src
---__init.py
--LICENSE.txt
--CHANGELOG.txt
--READDME.md
--setup.py

Мой setup.py

from setuptools import setup, find_packages
 
with open("README.md", "r", encoding = "utf-8") as fh:
    long_description = fh.read()
 
setup(
  name='manhattandistance',
  py_modules=["manhattandistance"],
  version='1.0.3',
  description='Calculates the Manhattan Distance of two places',
  long_description=open('README.md').read() +  open('CHANGELOG.txt').read(),
  long_description_content_type = "text/markdown",
  url='http://packages.python.org/manhattandistance',  
  author='NAME',
  author_email='MAIL',
  license='MIT License', 
  classifiers=[
  'Development Status :: 5 - Production/Stable',
  'Intended Audience :: Education',
  'Operating System :: Microsoft :: Windows :: Windows 10',
  'License :: OSI Approved :: MIT License',
  'Programming Language :: Python :: 3'
                ],
  keywords='distance', 
  package_dir = {'':'src'},
)

Мой init.py

def mandist(lat_from, lon_from, lat_to, lon_to):
    from math import cos
    phi_m = 3.141592653589793/180 * (lat_from + lat_to) / 2
    lat_k = 111.13209 - 0.56605 * cos(2 * phi_m) + 0.00120 * cos(4 * phi_m)
    lon_k = 111.41513 * cos(phi_m) - 0.0945 * cos(3 * phi_m) + 0.00012*cos(5 * phi_m)
    fin_lat = (lat_from - lat_to) * lat_k
    fin_lon = (lon_from - lon_to) * lon_k
    return abs(fin_lon) + abs(fin_lat)
py_modules=["manhattandistance"], подразумевает, что у вас есть модуль manhattandistance.py, которого на самом деле у вас нет. В каталоге src/ должен быть подкаталог пакета, но его нет. Чтобы использовать указанный подкаталог пакета, должна быть команда packages=… в setup.py. Мой совет — внимательно прочитать руководство по упаковке на Packaging.python.org/tutorials/packaging-projects, реструктурировать файлы/каталоги и переписать setup.py.
phd 15.12.2020 16:13

Итак, вы рекомендуете мне изменить py_modules=["utils"]? (Вот как я его сейчас называю, как рекомендовал Маттиа. Кроме того, обязательно ли иметь src/ и подкаталоги?

DionGR 15.12.2020 16:19

"py_modules=["utils"]" Да, если у вас есть utils.py. «Необходимо ли иметь src/ и подкаталоги?» Нет, если у вас нет пакетов.

phd 15.12.2020 16:33

Хорошо, я загрузил обновление и жду отзыва от моего друга, который проводит бета-тестирование. Другой вопрос, возможно ли сделать так, чтобы мне не нужно было использовать something.mandist (например, utils), а использовать только импорт из manhattandistance * (вместо пояснения, упоминающего utils?)

DionGR 15.12.2020 16:35

Если у меня нет папки модуля в той же папке, что и тестируемая программа, она просто не работает (как и другие модули). Я получаю «ModuleNotFoundError: нет модуля с именем« manhattandistance »», хотя я установил его через pip...

DionGR 15.12.2020 16:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
5
147
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте с: import manhattandistance

А затем используйте следующим образом: manhattandistance.mandist()

ps: я предлагаю иметь другой файл вместо того, чтобы помещать его в __init__.py

Обновлено:

Поместите свой код в файл utils.py. У вас будет такая структура:

manhattandistance/
    src/
        __init__.py
        utils.py
    LICENSE.txt
    CHANGELOG.txt
    READDME.md
    setup.py

Измените настройки, заменив package_dir на packages=setuptools.find_packages() (должно быть достаточно)

    setup(
      name='manhattandistance',
      version='1.0.3',
      description='Calculates the Manhattan Distance of two places',
      long_description=open('README.md').read() +  open('CHANGELOG.txt').read(),
      long_description_content_type = "text/markdown",
      url='http://packages.python.org/manhattandistance',  
      author='Dionysios Rigatos',
      author_email='[email protected]',
      license='MIT License', 
      classifiers=[
      'Development Status :: 5 - Production/Stable',
      'Intended Audience :: Education',
      'Operating System :: Microsoft :: Windows :: Windows 10',
      'License :: OSI Approved :: MIT License',
      'Programming Language :: Python :: 3'
                    ],
      keywords='distance', 
      packages=setuptools.find_packages(),
    )

тогда вы сможете импортировать модуль с помощью:

from manhattandistance.src.utils import mandist

Спасибо за ответ! ModuleNotFoundError: нет модуля с именем «manhattandistance». Обратите внимание на ту часть, которая выглядит так, как будто pip install manhattandistance не устанавливает все необходимые файлы, рисунок № 2.

DionGR 15.12.2020 15:56

Просто чтобы исключить ошибки, попробуйте создать новый файл с именем utils.py и поместить туда свой код. Затем переустановите пакет и импортируйте его с помощью from manhattandistance.utils import mandist

Mattia 15.12.2020 15:58

В папке .src или мне просто избавиться от нее и поместить все в основную папку manhattandistance (от utils.py до README и т. д.)?

DionGR 15.12.2020 16:03

Я меняю свой ответ, пожалуйста, попробуйте и дайте мне знать :)

Mattia 15.12.2020 16:39

Подпапка с именем manhattandistance внутри основной папки с именем manhattandistance? Скриншот: imgur.com/a/6N4VRR7

DionGR 15.12.2020 16:42

вы можете дать ему имя, которое вам нравится, мой пример. Вы можете сохранить ту структуру, которая была у вас раньше. Ответ обновлен

Mattia 15.12.2020 16:56

Ага, все работало отлично. Спасибо за помощь! У меня есть еще один вопрос; Можно ли избежать utils.py и использовать: from manhattandistance import *, поэтому мне не нужно использовать utils.mandist(x,x,x,x)?

DionGR 15.12.2020 17:03

Рад, что теперь это работает, но иметь импорт с * — не лучший подход, потому что, если вы обновите файл __init__.py, вы рискуете импортировать ненужную библиотеку в свой код. Если вы хотите не вызывать utils.mandist(), вы можете легко поместить utils в оператор импорта (как в примере) from manhattandistance.src.utils import mandist

Mattia 15.12.2020 17:17

Другие вопросы по теме