【问题标题】:ModuleNotFoundError with package from PyPi来自 PyPi 的包的 ModuleNotFoundError
【发布时间】:2021-09-30 23:14:06
【问题描述】:

我使用 twine 在 PyPi 上上传了一个包,一切正常。 现在我正在尝试安装该软件包并将其导入到脚本中。

根据 pip 模块已经正确安装:

PS C:\Users\alber> pip install ethbotutils
Requirement already satisfied: ethbotutils in c:\users\alber\appdata\local\programs\python\python39\lib\site-packages (1.1)

但是当我尝试在脚本、IDE 或 Python IDLE 中导入它时,我得到:

>>> import ethbotutils
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    import ethbotutils
ModuleNotFoundError: No module named 'ethbotutils'

这是pyproject.toml文件(存放在项目根目录):

[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"

还有这个 setup.py 文件(存储在包目录中):

from setuptools import setup

setup(
    name='ethbotutils',
    version=1.0,
    packages=["."],
    install_requires=["requests~=2.25.1", "PyYAML~=5.4.1"],
    python_requires=">=3.6"
)

编辑:

@a_guest 建议的内容似乎有效:如果我导入包中存在的脚本,例如“bot_utils”,一切正常,但当我尝试按其名称导入整个包时它仍然无法正常工作。我该如何解决?

【问题讨论】:

  • 试试python -m pip install ethlibpippython 很可能不属于同一个安装。
  • 试过了,同样的行为
  • 你的项目叫什么名字?没有名为ethlib on pypi 的项目。您还可以分享您的setup.pypyproject.toml 文件的内容吗?
  • 那是因为我删除了这个包。我真的厌倦了 python 如何与导入和模块 atm 一起工作,但总有一天我会再试一次
  • 你真的应该分享你的setup.py文件的内容。我的感觉是你有类似setup(name='ethlib', packages=find_packages(), ...) 的东西,然后在你的本地磁盘上,包含包的实际文件夹的名称与ethlib 不同。因此,如果您以 setup(name='ethlib', packages=['foo'], ...) 为例,那么 ethlib 是在 PyPI 上标识 project 的名称,但 foo 是它的实际 package包含(所以你需要import foo)。更多信息请参考this answer

标签: python module pypi


【解决方案1】:

分布的名称setupname 参数)决定了distribution(或项目)在 Python 生态系统中的识别方式;这包括Python Package Index,分发将位于URL https://pypi.org/project/&lt;name&gt;/

这与分布包含的实际 package(s) 不同(setuppackages 参数)。安装发行版时(例如通过pip)提供的正是这些软件包。

例如,如果setup.py文件包含以下规范

setup(
    name='foo',
    packages=['bar'],
    ...
)

那么这将创建一个名为foo发行版,它会安装一个名为bar;即在执行pip install foo 之后,可以通过import bar 访问该分发(包)的内容。通常,发行版的名称和顶级包的名称应该一致,以避免与可能安装到同一虚拟环境中的其他发行版发生冲突(有关详细信息,请参阅this answer)。

对于OP的具体示例,这意味着setup.py文件应该包含以下规范:

setup(
    name='ethbotutils',
    packages=['ethbotutils'],
    ...
)

为了使设置正常工作,所有相关的 Python 模块都需要放在位于 setup.py 文件旁边的本地文件夹 ethbotutils 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-01
    • 2016-12-26
    • 2019-06-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多