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个人模块不能被其他用户或我自己导入?的主要内容,如果未能解决你的问题,请参考以下文章
我可以将 TypeScript 类从我自己的模块导入到全局吗?
使用 Swift 5.1 编译的模块不能被 Swift 5.1.2 编译器导入