来自 PyPi 的包的 ModuleNotFoundError
ModuleNotFoundError with package from PyPi
我使用 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”一切正常,但当我尝试导入时它仍然无效整个包裹的名字。我该如何解决?
分布的 名称(setup
的 name
参数)决定了 distribution (or project) is identified within the Python ecosystem; this includes the Python Package Index 分布的位置在 URL https://pypi.org/project/<name>/
.
这与分布包含的实际 package(s)(setup
的 packages
参数)不同。这些软件包在安装发行版时可用(例如通过 pip
)。
例如,如果 setup.py
文件包含以下规范
setup(
name='foo',
packages=['bar'],
...
)
然后这将创建一个名为 foo
的 distribution,它安装一个名为 bar
的 package;即在执行 pip install foo
之后,可以通过 import bar
访问该分发(包)的内容。通常,发行版的名称和顶级包的名称应该一致,以避免与可能安装到同一虚拟环境中的其他发行版发生冲突(有关详细信息,请参阅 )。
对于 OP 的具体示例,这意味着 setup.py
文件应包含以下规范:
setup(
name='ethbotutils',
packages=['ethbotutils'],
...
)
为了使设置正常工作,所有相关的 Python 模块都需要放在本地文件夹 ethbotutils
中,该文件夹位于 setup.py
文件旁边。
我使用 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”一切正常,但当我尝试导入时它仍然无效整个包裹的名字。我该如何解决?
分布的 名称(setup
的 name
参数)决定了 distribution (or project) is identified within the Python ecosystem; this includes the Python Package Index 分布的位置在 URL https://pypi.org/project/<name>/
.
这与分布包含的实际 package(s)(setup
的 packages
参数)不同。这些软件包在安装发行版时可用(例如通过 pip
)。
例如,如果 setup.py
文件包含以下规范
setup(
name='foo',
packages=['bar'],
...
)
然后这将创建一个名为 foo
的 distribution,它安装一个名为 bar
的 package;即在执行 pip install foo
之后,可以通过 import bar
访问该分发(包)的内容。通常,发行版的名称和顶级包的名称应该一致,以避免与可能安装到同一虚拟环境中的其他发行版发生冲突(有关详细信息,请参阅
对于 OP 的具体示例,这意味着 setup.py
文件应包含以下规范:
setup(
name='ethbotutils',
packages=['ethbotutils'],
...
)
为了使设置正常工作,所有相关的 Python 模块都需要放在本地文件夹 ethbotutils
中,该文件夹位于 setup.py
文件旁边。