为啥客户的python包无法导入?

Posted

技术标签:

【中文标题】为啥客户的python包无法导入?【英文标题】:Why customer python package can not be imported?为什么客户的python包无法导入? 【发布时间】:2021-02-11 21:43:23 【问题描述】:

我创建了自己的名为jjnsegutils 的python 包并将其上传到Pypi 网站。但是我通过pip install jjnsegutils成功安装后,还是无法导入。错误显示:ModuleNotFoundError: No module named 'jjnsegutils'


整个过程的细节如下。

包结构及细节

我的包的结构是:

jjnsequtils
├─ __init__.py
├─ myutil
    ├─ __init__.py
    ├─ myutil.py
├─ LICENSE
├─ README.md
├─ setup.py

两个__init__.py 文件为空。

在我的setup.py

import setuptools

with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    name="jjnsegutils", # Replace with your own username
    version="0.0.10",
    author="Jingnan",
    author_email="jiajingnan2222@gmail.com",
    description="A package of common utilities for Medical images segmentation and evaluation.",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/Ordgod/jjnsegutils",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',
)

如何生成包?

我使用命令python setup.py sdist bdist_wheel 来生成分发文件。 logging information:

running sdist
running egg_info
writing jjnsegutils.egg-info/PKG-INFO
writing dependency_links to jjnsegutils.egg-info/dependency_links.txt
writing top-level names to jjnsegutils.egg-info/top_level.txt
reading manifest file 'jjnsegutils.egg-info/SOURCES.txt'
writing manifest file 'jjnsegutils.egg-info/SOURCES.txt'
running check
creating jjnsegutils-0.0.10
creating jjnsegutils-0.0.10/jjnsegutils.egg-info
creating jjnsegutils-0.0.10/myutil
copying files to jjnsegutils-0.0.10...
copying README.md -> jjnsegutils-0.0.10
copying setup.py -> jjnsegutils-0.0.10
copying jjnsegutils.egg-info/PKG-INFO -> jjnsegutils-0.0.10/jjnsegutils.egg-info
copying jjnsegutils.egg-info/SOURCES.txt -> jjnsegutils-0.0.10/jjnsegutils.egg-info
copying jjnsegutils.egg-info/dependency_links.txt -> jjnsegutils-0.0.10/jjnsegutils.egg-info
copying jjnsegutils.egg-info/top_level.txt -> jjnsegutils-0.0.10/jjnsegutils.egg-info
copying myutil/__init__.py -> jjnsegutils-0.0.10/myutil
copying myutil/myutil.py -> jjnsegutils-0.0.10/myutil
Writing jjnsegutils-0.0.10/setup.cfg
Creating tar archive
removing 'jjnsegutils-0.0.10' (and everything under it)
running bdist_wheel
running build
running build_py
installing to build/bdist.linux-x86_64/wheel
running install
running install_lib
creating build/bdist.linux-x86_64/wheel
copying build/lib/myutil.py -> build/bdist.linux-x86_64/wheel
creating build/bdist.linux-x86_64/wheel/myutil
copying build/lib/myutil/__init__.py -> build/bdist.linux-x86_64/wheel/myutil
copying build/lib/myutil/myutil.py -> build/bdist.linux-x86_64/wheel/myutil
running install_egg_info
Copying jjnsegutils.egg-info to build/bdist.linux-x86_64/wheel/jjnsegutils-0.0.10-py3.7.egg-info
running install_scripts
adding license file "LICENSE" (matched pattern "LICEN[CS]E*")
creating build/bdist.linux-x86_64/wheel/jjnsegutils-0.0.10.dist-info/WHEEL
creating 'dist/jjnsegutils-0.0.10-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it
adding 'myutil.py'
adding 'myutil/__init__.py'
adding 'myutil/myutil.py'
adding 'jjnsegutils-0.0.10.dist-info/LICENSE'
adding 'jjnsegutils-0.0.10.dist-info/METADATA'
adding 'jjnsegutils-0.0.10.dist-info/WHEEL'
adding 'jjnsegutils-0.0.10.dist-info/top_level.txt'
adding 'jjnsegutils-0.0.10.dist-info/RECORD'
removing build/bdist.linux-x86_64/wheel

如何分发包?

我使用命令twine upload dist/*dist 中的文件上传到Pypi。

如何安装包?

我使用命令pip install jjnsegutils 将它安装到我自己的环境中,名为py37,由conda 创建。它显示

Collecting jjnsegutils
  Downloading jjnsegutils-0.0.10-py3-none-any.whl (11 kB)
Installing collected packages: jjnsegutils
Successfully installed jjnsegutils-0.0.10

然后我在终端输入$ python 进入python交互式终端。并输入:

>>> import jjnsegutils

但它显示:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'jjnsegutils'

我尝试了哪些措施来诊断问题?

我通过命令$ pip show jjnsegutils检查了包,它显示:

Name: jjnsegutils
Version: 0.0.10
Summary: A package of common utilities for Medical images segmentation and evaluation.
Home-page: https://github.com/Ordgod/jjnsegutils
Author: Jingnan
Author-email: jiajingnan2222@gmail.com
License: UNKNOWN
Location: /home/jjia/.conda/envs/py37/lib/python3.7/site-packages
Requires:
Required-by:

我通过$ ls /home/jjia/.conda/envs/py37/lib/python3.7/site-packages进一步检查了它,它显示:

... # other packages
jjnsegutils-0.0.10.dist-info                
... # other packages

我认为应该有一个名为jjnsegutilsjjnsegutils-0.0.10.dist-info 的目录。但我没有看到。这是我无法导入自己的包的原因吗?

在整个过程中,我确保虚拟环境始终与名为py37 的虚拟环境相同。我用的是CentOS,python3.7。

期待任何讨论和建议。非常感谢!

【问题讨论】:

【参考方案1】:

你应该import myutil

packages 是应包含在分发包中的所有 Python 导入包的列表。我们可以使用 find_packages() 自动发现所有包和子包,而不是手动列出每个包。在这种情况下,包列表将是 example_pkg,因为这是唯一存在的包。 https://packaging.python.org/tutorials/packaging-projects/

【讨论】:

以上是关于为啥客户的python包无法导入?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Python 类初始化变量不能用于包导入中的类实例对象,但否则?

为啥我的 python 总是运行另一个包的文件

python中模块包无法导入import问题

请问一下python中已经安装过pandas包,但是导入的时候为啥发生这个错误,应该怎么解决

为啥 python 使用 3.8.1 和 3.9,然后无法安装包(错误:包 pkg 需要不同的 Python:3.8.1 不在 '>=3.9.0' 中)?

使用pip安装Python包,但无法导入使用