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

上下文

我正在创建名为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. 导入库
  6. 我收到错误消息: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',},)
sbsm_001 回答:通过pypi安装时,安装我自己的软件包会生成“ ModuleNotFoundError:没有名为'<my package>'的模块”

我想是这样的:

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

本文链接:https://www.f2er.com/2878004.html

大家都在问