gpt4 book ai didi

python - pip 安装。仅创建 dist-info 而不是包

转载 作者:IT老高 更新时间:2023-10-28 20:29:10 30 4
gpt4 key购买 nike

我正在尝试使用 pip install . 创建一个我想安装的 python 包本地。包名列在pip freeze但是 import <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'
],

)

最佳答案

由于该问题已变得非常流行,因此当您在安装后丢失文件时,请执行以下诊断步骤。想象有一个具有以下结构的示例项目:

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

但看不到 spamspam/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 文件并从中安装您的包。如果在详细模式下重新安装,我们可以检查轮子构建过程的日志。第一步是卸载包:

$ 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 中的文件。这意味着它们根本没有包含在轮文件中,因此没有被 pip 安装。最常见的错误来源是:

缺少包:检查 packages 参数

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

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

关于python - pip 安装。仅创建 dist-info 而不是包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50585246/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com