【问题标题】:Download own module with pip, "No module named ..."使用 pip 下载自己的模块,“没有模块名为 ...”
【发布时间】:2018-02-28 23:01:08
【问题描述】:

我正在构建自己的 Python 模块,只是为了了解它的工作原理。我的 Python 很不错,但我之前从未构建或提交过任何包。

我遵循了Python Hostedthe official setuptools documentation 上的指南以及python.org 上的这篇文章。但是,我仍然无法让它工作。

包结构,包含三个模块(FileHelpers、TypeHelpers、XmlHelpers),如下所示:

PyLT3/
|- .git/
|- .idea/
|- setup.py
|- __init__.py
|- README.rst
|- LICENSE.txt
|- .gitignore
|- FileHelpers.py
|- TypeHelpers.py
|- XmlHelpers.py

setup.py的内容:

from setuptools import setup, find_packages

setup(
    name='PyLT3',
    version='0.1.3',
    description='A collection of helper functions and NLP scripts',
    long_description='During my time working on the PhD project PreDict, I have written and gathered a bunch of useful functions. They are collected here as part of the PyLT3 package.',
    keywords='nlp xml file-handling helpers',
    packages=find_packages(),
    url='https://github.com/BramVanroy/PyLT3',
    author='Bram Vanroy',
    author_email='bramvanroy@hotmail.com',
    license='MIT',
    classifiers=[
        'Development Status :: 1 - Planning',
        'Intended Audience :: Developers',
        'Intended Audience :: Science/Research',
        'Topic :: Scientific/Engineering',
        'Topic :: Text Processing',
        'License :: OSI Approved :: MIT License',
        'Programming Language :: Python :: 3.6',
    ],
    project_urls = {
        'Bug Reports': 'https://github.com/BramVanroy/PyLT3/issues',
        'Source': 'https://github.com/BramVanroy/PyLT3',
    },
    python_requires='>=3.6',
)

MANIFEST.in 的内容:

prune .idea/*

利用这些数据,我创建了一个分布:

python setup.py sdist

还有一个轮子:

python setup.py bdist_wheel

然后将分发上传到 PyPi:

twine upload dist/*

为了测试这一点,我用 pip 下载了the package

pip install PyLT3

(也用pip3。)安装成功。

但是当我尝试一个简单的import PyLT3 时,我得到一个错误

import PyLT3 

ModuleNotFoundError: 没有名为“PyLT3”的模块

这很奇怪,因为 pip 告诉我模块已成功安装。所以我去寻找模块,它的*.info 安装在C:\Python\Python36\Lib\site-packages\PyLT3-0.1.3.dist-info 中。但我假设这不是实际的包,而只是一个信息目录。没有其他包(例如PyLT3/)。

所有这一切让我相信我在包装时做错了什么。我忘记了什么?

【问题讨论】:

  • 您是否在您的站点包中看到FileHelpers.py 等?我打包python的首选方法是将所有源文件(包括__init__.py放入项目的子目录中。在你的情况下,这最终会像PyLT3/PyLT3/__init__.py
  • @Yossarian 不,他们也不在那里。只有信息文件。你的意思是每个模块都有自己的 init 进入自己的文件夹,还是只是我需要一个与包同名的总体父目录?
  • @BramVanroy 根据pythonhosted.org/an_example_pypi_project/…,您应该至少有一个带有__init__.py 文件的“父”目录(可能为空)您可以删除顶级__init__.py
  • 一个“通用”技巧:在上传到 pypi 之前,您可能会发现将 dist 文件 pip 安装到本地计算机上全新的虚拟环境中很有用。通过这种方式,您可以检查安装是否有效,以及库/应用程序,并避免多次上传相同(已修补)。
  • 天啊,愚蠢的错误!我以为您的 setup.py 的父目录实际上是您正在创建的包,但事实并非如此!傻我。谢谢,我修复了错误并上传了一个新版本。现在好像上班了。请有人发布包含此信息的详细答案,我会尽快接受。

标签: python pip packages setup.py pypi


【解决方案1】:

您的包没有注册名为 PyLT3 的包。

您的项目结构应如下所示:

PyLT3/  # This is your project directory. Its name is irrelevant from the packaging point of view.
 |- .git/
 |- .idea/
 |- setup.py
 |- README.rst
 |- LICENSE.txt
 |- .gitignore
 |- PyLT3/  # This is directory holds your python package.
     |- __init__.py
     |- FileHelpers.py
     |- TypeHelpers.py
     |- XmlHelpers.py

您可以通过在项目目录中运行 pip install -e . 在本地尝试此操作。这使您可以在发布之前验证其是否有效。

个人说明:我还强烈建议使用小写的包和模块名称,如PEP8

【讨论】:

  • 感谢您的回答。我不知道命名约定。我更新了软件包以反映这一点。谢谢。
猜你喜欢
  • 2020-02-12
  • 2020-01-30
  • 2021-06-08
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-30
相关资源
最近更新 更多