В настоящее время я работаю над довольно простым модулем 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=["utils"]? (Вот как я его сейчас называю, как рекомендовал Маттиа. Кроме того, обязательно ли иметь src/ и подкаталоги?
"py_modules=["utils"]
" Да, если у вас есть utils.py
. «Необходимо ли иметь src/ и подкаталоги?» Нет, если у вас нет пакетов.
Хорошо, я загрузил обновление и жду отзыва от моего друга, который проводит бета-тестирование. Другой вопрос, возможно ли сделать так, чтобы мне не нужно было использовать something.mandist (например, utils), а использовать только импорт из manhattandistance * (вместо пояснения, упоминающего utils?)
Если у меня нет папки модуля в той же папке, что и тестируемая программа, она просто не работает (как и другие модули). Я получаю «ModuleNotFoundError: нет модуля с именем« manhattandistance »», хотя я установил его через pip...
Попробуйте с:
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.
Просто чтобы исключить ошибки, попробуйте создать новый файл с именем utils.py
и поместить туда свой код. Затем переустановите пакет и импортируйте его с помощью from manhattandistance.utils import mandist
В папке .src или мне просто избавиться от нее и поместить все в основную папку manhattandistance (от utils.py до README и т. д.)?
Я меняю свой ответ, пожалуйста, попробуйте и дайте мне знать :)
Подпапка с именем manhattandistance внутри основной папки с именем manhattandistance? Скриншот: imgur.com/a/6N4VRR7
вы можете дать ему имя, которое вам нравится, мой пример. Вы можете сохранить ту структуру, которая была у вас раньше. Ответ обновлен
Ага, все работало отлично. Спасибо за помощь! У меня есть еще один вопрос; Можно ли избежать utils.py и использовать: from manhattandistance import *, поэтому мне не нужно использовать utils.mandist(x,x,x,x)?
Рад, что теперь это работает, но иметь импорт с *
— не лучший подход, потому что, если вы обновите файл __init__.py
, вы рискуете импортировать ненужную библиотеку в свой код. Если вы хотите не вызывать utils.mandist()
, вы можете легко поместить utils
в оператор импорта (как в примере) from manhattandistance.src.utils import mandist
py_modules=["manhattandistance"],
подразумевает, что у вас есть модульmanhattandistance.py
, которого на самом деле у вас нет. В каталогеsrc/
должен быть подкаталог пакета, но его нет. Чтобы использовать указанный подкаталог пакета, должна быть командаpackages=…
вsetup.py
. Мой совет — внимательно прочитать руководство по упаковке на Packaging.python.org/tutorials/packaging-projects, реструктурировать файлы/каталоги и переписатьsetup.py
.