python - 无法加载 Python 包的子模块:ModuleNotFoundError: No module named
问题描述
我是 Python 新手。这看起来是一个非常简单的问题,但我尽力解决后无法解决。
我正在尝试将我开发的 python 包发布到神器商店。但是,当我在目标机器上下载包时,会遇到关于未找到内部模块的错误。包装和安装看起来都不错。输出消息显示它确实包含子模块。
我有一个如下的目录结构。
samplepackage/
hello.py
__init__.py
dir1/
__init__.py
dir1pkg.py
以下是文件的内容。初始化文件是空的。
你好.py
import sys
from dir1.dir1pkg import dir1pkg
def main ():
dirpkg = dir1pkg('This is msg')
dirpkg.printmsg()
if __name__ == "__main__":
main()
目录1pkg.py
class dir1pkg:
def __init__(self,msg):
self.msg = msg
def printmsg(self):
print(self.msg)
安装程序.py
import setuptools
from setuptools import setup, find_packages, find_namespace_packages
setup(
name="samplepackage",
version="0.0.3",
author="myname",
author_email="myemail@email.com",
description="This is a sample package",
long_description="This is long description",
long_description_content_type="text/markdown",
packages=setuptools.find_packages(),
include_package_data=True,
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
entry_points={
"console_scripts":[
"samplepackage=samplepackage.hello:main"
]
}
,python_requires='>=3.7'
)
以下是我如何打包和发布到工件存储库。
python setup.py sdist bdist_wheel
twine upload --config-file ".pypirc" -r <artifact_feed> dist/*
以下是我在目标上安装的方式。
python -m pip install --upgrade samplepackage
python -m SamplePackage.hello.py
这给了我下面的错误
C:\Users\manan\Desktop>python -m samplepackage.hello.py 回溯(最近一次通话最后): _run_module_as_main 中的文件“C:\Users\manan\AppData\Local\Programs\Python\Python38\lib\runpy.py”,第 185 行 mod_name, mod_spec, 代码 = _get_module_details(mod_name, _Error) _get_module_details 中的文件“C:\Users\manan\AppData\Local\Programs\Python\Python38\lib\runpy.py”,第 111 行 __import__(pkg_name) 文件“C:\Users\manan\AppData\Local\Programs\Python\Python38\lib\site-packages\samplepackage\hello.py”,第 2 行,在 从 dir1.dir1pkg 导入 dir1pkg ModuleNotFoundError:没有名为“dir1”的模块
但是,这从我开发包的地方运行得很好。我可以在下面执行,它能够毫无问题地找到内部模块。
C:\Users\mdmehta\Desktop\PythonPackage\samplepackage>python hello.py 这是味精
我已经尝试在 setup.py 周围做了很多小动作,但它们都不起作用。甚至安装包的输出看起来也不错。我确实看到 dir1 被包含在一个包中。
>>> 帮助('样品包') 包示例包的帮助: 姓名 样品包 包装内容 dir1(包) 你好 文件 c:\users\mdmehta\appdata\local\programs\python\python38\lib\site-packages\samplepackage\__init__.py
解决方案
想通了问题。我们必须使用完全导入才能使其工作。
文件 hello.py 应该使用
from samplepackage.dir1.dir1pkg import dir1pkg
不要将 Visual Studio 用于 python 项目。它不喜欢完全限定的包名。切换到 pycharm 并将包导入修改为完全合格的,一切都开始工作了。
推荐阅读
- laravel - 由于我是 Laravel 的新手,因此我遇到了迁移问题。我已经尝试了这里描述的所有内容,但没有成功
- c# - 为什么在 wpf 数据网格中编辑数据不会引发绑定属性的“设置”事件?
- c# - 无法从远程设备连接到 .Net Core API Server
- reactjs - React Router - 身份验证检查呈现空白页面
- ruby-on-rails - 来自子控制器的响应
- intellij-idea - HashiCorp Terraform / HCL 语言支持不起作用
- git - 获取远程 repo 'origin' 时出错:无法将 Jenkins 连接到 Git 存储库
- python - 从单击“显示更多”时 URL 不变的站点中抓取数据
- ocaml - ocamlmktop 错误:两者都定义了一个名为 Parser 的模块;两者都定义了一个名为 Lexer 的模块;
- pyspark - pyspark Regexp_Extract - 从字符串列中提取多个单词