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

Posted

技术标签:

【中文标题】PyPI个人模块不能被其他用户或我自己导入?【英文标题】:PyPI personal module cannot be imported by other users or myself? 【发布时间】:2021-03-26 05:20:44 【问题描述】:

我目前正在开发一个相当简单的 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)

【问题讨论】:

py_modules=["manhattandistance"], 表示您有一个模块 manhattandistance.py,而您实际上并没有。在目录src/ 中必须有一个包子目录,但没有。要使用所述包子目录,setup.py 中应该有命令packages=…。我的建议是仔细阅读packaging.python.org/tutorials/packaging-projects 的打包教程,重组文件/目录并重写setup.py 所以,你建议我更改 py_modules=["utils"]? (这就是我现在的命名方式,正如 Mattia 建议的那样。另外,是否有必要拥有 src/ 和子目录? "py_modules=["utils"]" 是的,如果您有 utils.py。 “是否有必要拥有 src/ 和子目录?” 如果您没有软件包,则否。 好的,我推送了更新,我正在等待我正在测试的朋友的反馈。另一个问题,是否可以让它好像我不必使用 something.mandist(例如 utils)而只使用 from manhattandistance import *(而不是 excplicity 提到 utils?) 如果我的模块文件夹与我正在测试的程序不在同一个文件夹中,它根本不起作用(就像其他模块一样)。我得到“”ModuleNotFoundError: No module named 'manhattandistance'"" 虽然我已经通过 pip 安装了它... 【参考方案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='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

【讨论】:

感谢您的回答! ModuleNotFoundError: No module named 'manhattandistance' 请看一下看起来 pip install manhattandistance 没有安装所有必要文件的部分,图片#2。 只是为了排除错误,尝试创建一个名为utils.py 的新文件并将您的代码放在那里。然后重新安装包并使用from manhattandistance.utils import mandist 导入 在 .src 文件夹中,还是我应该摆脱它并将所有内容都放在 manhattandistance 主文件夹中(从 utils.py 到 README 等)? 我更改了答案,请尝试并告诉我:) 在名为 manhattandistance 的主文件夹内有名为 manhattandistance 的子文件夹?截图:imgur.com/a/6N4VRR7

以上是关于PyPI个人模块不能被其他用户或我自己导入?的主要内容,如果未能解决你的问题,请参考以下文章

特殊权限之sticky-bit

我可以将 TypeScript 类从我自己的模块导入到全局吗?

使用 Swift 5.1 编译的模块不能被 Swift 5.1.2 编译器导入

如何在绝对导入中设置没有点符号的 Pypi 包 - python3

python导入模块的方法都有哪些

使用 Swift 4.0.3 编译的模块不能被 Swift 4.2.1 编译器导入