为什么客户的python包无法导入?

Jin*_*Jia 5 python linux pip python-import python-wheel

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

\n
\n

整个过程的详细信息如下。

\n

封装结构和细节

\n

我的包的结构是:

\n
jjnsequtils\n\xe2\x94\x9c\xe2\x94\x80 __init__.py\n\xe2\x94\x9c\xe2\x94\x80 myutil\n    \xe2\x94\x9c\xe2\x94\x80 __init__.py\n    \xe2\x94\x9c\xe2\x94\x80 myutil.py\n\xe2\x94\x9c\xe2\x94\x80 LICENSE\n\xe2\x94\x9c\xe2\x94\x80 README.md\n\xe2\x94\x9c\xe2\x94\x80 setup.py\n\n
Run Code Online (Sandbox Code Playgroud)\n

两个__init__.py文件都是空的。

\n

在我的setup.py

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

如何生成包?

\n

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

\n
running sdist\nrunning egg_info\nwriting jjnsegutils.egg-info/PKG-INFO\nwriting dependency_links to jjnsegutils.egg-info/dependency_links.txt\nwriting top-level names to jjnsegutils.egg-info/top_level.txt\nreading manifest file 'jjnsegutils.egg-info/SOURCES.txt'\nwriting manifest file 'jjnsegutils.egg-info/SOURCES.txt'\nrunning check\ncreating jjnsegutils-0.0.10\ncreating jjnsegutils-0.0.10/jjnsegutils.egg-info\ncreating jjnsegutils-0.0.10/myutil\ncopying files to jjnsegutils-0.0.10...\ncopying README.md -> jjnsegutils-0.0.10\ncopying setup.py -> jjnsegutils-0.0.10\ncopying jjnsegutils.egg-info/PKG-INFO -> jjnsegutils-0.0.10/jjnsegutils.egg-info\ncopying jjnsegutils.egg-info/SOURCES.txt -> jjnsegutils-0.0.10/jjnsegutils.egg-info\ncopying jjnsegutils.egg-info/dependency_links.txt -> jjnsegutils-0.0.10/jjnsegutils.egg-info\ncopying jjnsegutils.egg-info/top_level.txt -> jjnsegutils-0.0.10/jjnsegutils.egg-info\ncopying myutil/__init__.py -> jjnsegutils-0.0.10/myutil\ncopying myutil/myutil.py -> jjnsegutils-0.0.10/myutil\nWriting jjnsegutils-0.0.10/setup.cfg\nCreating tar archive\nremoving 'jjnsegutils-0.0.10' (and everything under it)\nrunning bdist_wheel\nrunning build\nrunning build_py\ninstalling to build/bdist.linux-x86_64/wheel\nrunning install\nrunning install_lib\ncreating build/bdist.linux-x86_64/wheel\ncopying build/lib/myutil.py -> build/bdist.linux-x86_64/wheel\ncreating build/bdist.linux-x86_64/wheel/myutil\ncopying build/lib/myutil/__init__.py -> build/bdist.linux-x86_64/wheel/myutil\ncopying build/lib/myutil/myutil.py -> build/bdist.linux-x86_64/wheel/myutil\nrunning install_egg_info\nCopying jjnsegutils.egg-info to build/bdist.linux-x86_64/wheel/jjnsegutils-0.0.10-py3.7.egg-info\nrunning install_scripts\nadding license file "LICENSE" (matched pattern "LICEN[CS]E*")\ncreating build/bdist.linux-x86_64/wheel/jjnsegutils-0.0.10.dist-info/WHEEL\ncreating 'dist/jjnsegutils-0.0.10-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it\nadding 'myutil.py'\nadding 'myutil/__init__.py'\nadding 'myutil/myutil.py'\nadding 'jjnsegutils-0.0.10.dist-info/LICENSE'\nadding 'jjnsegutils-0.0.10.dist-info/METADATA'\nadding 'jjnsegutils-0.0.10.dist-info/WHEEL'\nadding 'jjnsegutils-0.0.10.dist-info/top_level.txt'\nadding 'jjnsegutils-0.0.10.dist-info/RECORD'\nremoving build/bdist.linux-x86_64/wheel\n\n
Run Code Online (Sandbox Code Playgroud)\n

我如何分发包?

\n

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

\n

如何安装该软件包?

\n

我使用命令pip install jjnsegutils将其安装到我自己的py37由 conda 创建的环境中。表明

\n
Collecting jjnsegutils\n  Downloading jjnsegutils-0.0.10-py3-none-any.whl (11 kB)\nInstalling collected packages: jjnsegutils\nSuccessfully installed jjnsegutils-0.0.10\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
>>> import jjnsegutils\n
Run Code Online (Sandbox Code Playgroud)\n

但它显示:

\n
Traceback (most recent call last):\n  File "<stdin>", line 1, in <module>\nModuleNotFoundError: No module named 'jjnsegutils'\n\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
Name: jjnsegutils\nVersion: 0.0.10\nSummary: A package of common utilities for Medical images segmentation and evaluation.\nHome-page: https://github.com/Ordgod/jjnsegutils\nAuthor: Jingnan\nAuthor-email: jiajingnan2222@gmail.com\nLicense: UNKNOWN\nLocation: /home/jjia/.conda/envs/py37/lib/python3.7/site-packages\nRequires:\nRequired-by:\n\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
... # other packages\njjnsegutils-0.0.10.dist-info                \n... # other packages\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

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

\n

小智 2

你应该import myutil

\n
\n

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

\n
\n