点安装。只创建 dist-info 而不是包

点安装。只创建 dist-info 而不是包

我正在尝试制作一个我想在本地使用 pip install . 安装的 python 包。包名称列在 pip freezeimport <package> 导致错误 No module named <package> 。此外,site-packages 文件夹只包含一个 dist-info 文件夹。 find_packages() 能够找到包。我错过了什么?

 import io

import os

import sys

from shutil import rmtree

from setuptools import find_packages, setup, Command

# Package meta-data.

NAME = '<package>'

DESCRIPTION = 'description'

URL = ''

EMAIL = 'email'

AUTHOR = 'name'

# What packages are required for this module to be executed?

REQUIRED = [

# 'requests', 'maya', 'records',

]

# The rest you shouldn't have to touch too much :)

# ------------------------------------------------

# Except, perhaps the License and Trove Classifiers!

# If you do change the License, remember to change the Trove Classifier for that!

here = os.path.abspath(os.path.dirname(__file__))

# Where the magic happens:

setup(

name=NAME,

#version=about['__version__'],

description=DESCRIPTION,

# long_description=long_description,

author=AUTHOR,

author_email=EMAIL,

url=URL,

packages=find_packages(),

# If your package is a single module, use this instead of 'packages':

# py_modules=['mypackage'],

# entry_points={

# 'console_scripts': ['mycli=mymodule:cli'],

# },

install_requires=REQUIRED,

include_package_data=True,

license='MIT',

classifiers=[

# Trove classifiers

# Full list: https://pypi.python.org/pypi?%3Aaction=list_classifiers

'License :: OSI Approved :: MIT License',

'Programming Language :: Python',

'Programming Language :: Python :: 2.6',

'Programming Language :: Python :: 2.7',

'Programming Language :: Python :: 3',

'Programming Language :: Python :: 3.3',

'Programming Language :: Python :: 3.4',

'Programming Language :: Python :: 3.5',

'Programming Language :: Python :: 3.6',

'Programming Language :: Python :: Implementation :: CPython',

'Programming Language :: Python :: Implementation :: PyPy'

],

)

原文由 André Betz 发布,翻译遵循 CC BY-SA 4.0 许可协议


回答:

由于这个问题变得非常流行,下面是安装后丢失文件时要执行的诊断步骤。想象一下有一个具有以下结构的示例项目:

 root

├── spam

│ ├── __init__.py

│ ├── data.txt

│ ├── eggs.py

│ └── fizz

│ ├── __init__.py

│ └── buzz.py

├── bacon.py

└── setup.py

现在我运行 pip install . ,检查包是否已安装:

 $ pip list

Package Version

---------- -------

mypkg 0.1

pip 19.0.1

setuptools 40.6.3

wheel 0.32.3

但请参见 spam , - ,NOR spam/eggs.pybacon.pyspam/fizz/buzz.py

 $ pip show -f mypkg

Name: mypkg

Version: 0.1

...

Files:

mypkg-0.1.dist-info/DESCRIPTION.rst

mypkg-0.1.dist-info/INSTALLER

mypkg-0.1.dist-info/METADATA

mypkg-0.1.dist-info/RECORD

mypkg-0.1.dist-info/WHEEL

mypkg-0.1.dist-info/metadata.json

mypkg-0.1.dist-info/top_level.txt

那么现在怎么办?

通过检查车轮构建日志进行诊断

除非被告知不要这样做,否则 pip 将始终尝试构建一个 wheel 文件并从中安装你的包。如果在详细模式下重新安装,我们可以检查 wheel 构建过程的日志。第一步是卸载软件包:

 $ pip uninstall -y mypkg

...

然后再次安装它,但现在有一个额外的参数:

 $ pip install . -vvv

...

现在,如果我检查日志:

 $ pip install . -vvv | grep 'adding'

adding 'mypkg-0.1.dist-info/METADATA'

adding 'mypkg-0.1.dist-info/WHEEL'

adding 'mypkg-0.1.dist-info/top_level.txt'

adding 'mypkg-0.1.dist-info/RECORD'

我注意到没有任何地方提到 spam 目录或 bacon.py 中的文件。这意味着它们根本没有包含在 wheel 文件中,因此没有被 pip 安装。最常见的错误来源是:

缺少包:检查 packages 参数

确认您已将 packages 参数传递给设置函数。检查您是否提到 了所有 应该安装的包。如果只提到父包,则不会自动收集子包!例如,在设置脚本中

from setuptools import setup

setup(

name='mypkg',

version='0.1',

packages=['spam']

)

spam 将被安装,但不会安装 spam.fizz 因为它本身就是一个包,必须明确提及。修复它:

 from setuptools import setup

setup(

name='mypkg',

version='0.1',

packages=['spam', 'spam.fizz']

)

如果你有很多包,使用 setuptools.find_packages 来自动化这个过程:

 from setuptools import find_packages, setup

setup(

name='mypkg',

version='0.1',

packages=find_packages() # will return a list ['spam', 'spam.fizz']

)

如果您缺少模块:

缺少模块:检查 py_modules 参数

在上面的示例中,我将在安装后缺少 bacon.py 因为它不属于任何包。我必须在单独的参数中提供它的模块名称 py_modules

 from setuptools import find_packages, setup

setup(

name='mypkg',

version='0.1',

packages=find_packages(),

py_modules=['bacon']

)

缺少数据文件:检查 package_data 参数

我现在拥有所有源代码文件,但 data.txt 文件仍未安装。位于包目录下的数据文件应通过 package_data 参数添加。修复上述设置脚本:

 from setuptools import find_packages, setup

setup(

name='mypkg',

version='0.1',

packages=find_packages(),

package_data={'spam': ['data.txt']},

py_modules=['bacon']

)

不要试图使用 data_files 参数。将数据文件放在一个包下并配置 package_data 代替。

修复安装脚本后,验证安装后包文件是否到位

如果我现在重新安装软件包,我会注意到所有文件都已添加到轮子中:

 $ pip install . -vvv | grep 'adding'

adding 'bacon.py'

adding 'spam/__init__.py'

adding 'spam/data.txt'

adding 'spam/eggs.py'

adding 'spam/fizz/__init__.py'

adding 'spam/fizz/buzz.py'

adding 'mypkg-0.1.dist-info/METADATA'

adding 'mypkg-0.1.dist-info/WHEEL'

adding 'mypkg-0.1.dist-info/top_level.txt'

adding 'mypkg-0.1.dist-info/RECORD'

它们也将在属于 mypkg 的文件列表中可见:

 $ pip show -f mypkg

Name: mypkg

Version: 0.1

...

Files:

__pycache__/bacon.cpython-36.pyc

bacon.py

mypkg-0.1.dist-info/INSTALLER

mypkg-0.1.dist-info/METADATA

mypkg-0.1.dist-info/RECORD

mypkg-0.1.dist-info/WHEEL

mypkg-0.1.dist-info/top_level.txt

spam/__init__.py

spam/__pycache__/__init__.cpython-36.pyc

spam/__pycache__/eggs.cpython-36.pyc

spam/data.txt

spam/eggs.py

spam/fizz/__init__.py

spam/fizz/__pycache__/__init__.cpython-36.pyc

spam/fizz/__pycache__/buzz.cpython-36.pyc

spam/fizz/buzz.py

原文由 hoefling 发布,翻译遵循 CC BY-SA 4.0 许可协议

以上是 点安装。只创建 dist-info 而不是包 的全部内容, 来源链接: utcz.com/p/938715.html

回到顶部