PyPI 个人模块无法被其他用户或我自己导入?

PyPI personal module cannot be imported by other users or myself?

我目前正在开发一个相当简单的 Python 模块,我一整天都在尝试将它发布到 PyPI 上。这是我第一次做。

我已经使用 python3 setup.py sdist bdist_wheel 成功构建了它,然后完成 python3 -m twine upload --repository testpypi dist/*twine upload dist/* 并成功上传 here。 但是,当我或我的朋友执行 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='Dionysios Rigatos',
  author_email='dion.rigatos@gmail.com',
  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)

试试: 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='dion.rigatos@gmail.com',
      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