安装我自己的软件包会生成“ ModuleNotFoundError:通过pypi安装时,没有名为''的模块

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安装我自己的软件包会生成“ ModuleNotFoundError:通过pypi安装时,没有名为''的模块相关的知识,希望对你有一定的参考价值。

上下文

我正在创建名为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',
    ,

)
答案

我认为是这样:

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选项。仅在要安装的软件包位于其他名称的文件夹中时使用。

以上是关于安装我自己的软件包会生成“ ModuleNotFoundError:通过pypi安装时,没有名为''的模块的主要内容,如果未能解决你的问题,请参考以下文章

无法安装我自己生成的 apk

源码包打包让公司其他人更快的安装

仅安装Specflow.MSTest软件包时,Specflow 3.0会错误地生成NUnit测试

写好的Markdown怎么生成HTML

有啥app可以自己做文字图片

谁知道Readme是啥文件?偶没有创建,是自己生成的,可以删除吗?