【问题标题】:Installing my own package generates a "ModuleNotFoundError: No module named '<my package>' when installed via pypi安装我自己的包会生成“ModuleNotFoundError: No module named '<my package>' 当通过 pypi 安装时
【发布时间】:2019-12-22 11:32:21
【问题描述】:

上下文

我正在创建我的第一个包,名为 countries_utils,可在 https://pypi.org/project/countries-utils 上使用。

我已阅读以下教程:

  1. 打包 Python 项目 https://packaging.python.org/tutorials/packaging-projects/
  2. 管理应用程序依赖关系https://packaging.python.org/tutorials/managing-dependencies/#managing-dependencies
  3. 打包分发项目https://packaging.python.org/guides/distributing-packages-using-setuptools/#distributing-packages

库代码countries_utils

该库的源代码可在 bitbucket 上获得:

问题

  1. 我运行命令pip install countries-utils
  2. 我下载了最新版本的库
  3. 我运行python 命令
  4. 我使用import countries_utils 导入库
  5. 我收到错误:ModuleNotFoundError: No module named 'countries_utils'

问题:我错过了什么?

pip list 命令的结果

pip list

Package                                       Version    
--------------------------------------------- -----------
...
contextlib2                                   0.5.5
countries-utils                               1.0.13
country-list                                  0.1.4
cryptography                                  2.7
...

错误

这是在 python 控制台中执行import countries_utils 的结果:

> python

Python 3.7.4 (default, Aug  9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import countries_utils
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'countries_utils'

setup.py 文件(工作版本)


# -*- coding: utf-8 -*-

# Copyright (c) ALT-F1 SPRL, Abdelkrim Boujraf. All rights reserved.
# Licensed under the EUPL License, Version 1.2.
# See LICENSE in the project root for license information.

from os import path
import json
import setuptools

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


here = path.abspath(path.dirname(__file__))
root = path.dirname(here)
package_json = path.join(here, 'package.json')
# a workaround when installing locally from git repository with pip install -e .

if not path.isfile(package_json):
    package_json = path.join(root, 'package.json')

# version number and all other params from package.json
with open(package_json, encoding='utf-8') as f:
    package = json.load(f)

setuptools.setup(
    name=package['name'],
    version=package['version'],
    author=package['author']['name'],
    author_email=package['author']['email'],
    description=package['description'],
    license=package['license'],
    long_description=long_description,
    long_description_content_type='text/markdown',
    url=package['repository']['url'],
    install_requires=[
        'pycountry',
        'pandas',
        'country-list'
    ],
    packages=[package['name']],
    keywords=package['keywords'],

    # Find the list of classifiers : https://pypi.org/classifiers/
    classifiers=[
        'Development Status :: 5 - Production/Stable',
        'Intended Audience :: Developers',
        'License :: OSI Approved :: European Union Public Licence 1.2 (EUPL 1.2)',
        'Operating System :: OS Independent',
        'Programming Language :: Python :: 3.7',
        'Topic :: Software Development :: Libraries :: Python Modules',
    ],

    python_requires='>=3.5',

    project_urls={  # Optional
        'Bug Reports': 'https://bitbucket.org/altf1be/countries-utils/issues?status=new&status=open',
        'Company behind the library': 'http://www.alt-f1.be',
        'Source': 'https://bitbucket.org/altf1be/countries-utils',
    },

)

【问题讨论】:

  • 您需要在此处发布您的setup.py,而不是指向外部存储库的链接,以便查看此问题的人会看到相同的代码集来重现问题。 Bitbucket 中的代码(尤其是 master 分支的链接)会随着时间的推移而改变或消失。
  • 从 PyPi (pip install countries_utils) 安装软件包后的快速检查显示,没有 countries_utils 文件夹被添加到 site-packages 目录中,所以.. 错误是意料之中的。
  • 亲爱的@gino-mempin 创建文件夹站点包缺少什么?

标签: python-3.x setup.py pypi


【解决方案1】:

我认为是这样的:

packages=setuptools.find_packages(),
...
package_dir={'': 'countries_utils'},  # Optional

来自 Python 的 Distutils Examples(重点是我的):

如果你想把模块放在没有为其包命名的目录中, 那么您需要再次使用package_dir 选项。例如,如果 src 目录包含 foobar 包中的模块:

<root>/
        setup.py
        src/
                 __init__.py
                 foo.py
                 bar.py

适当的设置脚本是

from distutils.core import setup
setup(name='foobar',
      version='1.0',
      package_dir={'foobar': 'src'},
      packages=['foobar'],
      )

在您的情况下,包名称是countries_utils,并且您已经有一个适当命名的包目录countries_utils。所以不需要package_dir 选项。它仅在要安装的软件包位于不同名称的文件夹中时使用。

【讨论】:

  • 我设法根据您的反馈和 Distutils 示例链接使其工作
猜你喜欢
  • 2021-02-07
  • 2018-12-07
  • 1970-01-01
  • 2019-05-10
  • 2020-03-17
  • 2022-06-21
  • 2019-03-17
  • 2018-06-12
  • 2018-12-17
相关资源
最近更新 更多