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

And*_*etz 26 python pip package setup.py

我正在尝试制作一个我想在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'
    ],

)
Run Code Online (Sandbox Code Playgroud)

hoe*_*ing 21

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

root
??? spam
?   ??? __init__.py
?   ??? data.txt
?   ??? eggs.py
?   ??? fizz
?       ??? __init__.py
?       ??? buzz.py
??? bacon.py
??? setup.py
Run Code Online (Sandbox Code Playgroud)

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

$ pip list
Package    Version
---------- -------
mypkg      0.1    
pip        19.0.1 
setuptools 40.6.3 
wheel      0.32.3 
Run Code Online (Sandbox Code Playgroud)

但既没有看到spam,也没有spam/eggs.py也没有bacon.py,也不spam/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
Run Code Online (Sandbox Code Playgroud)

那么现在该怎么办?

通过检查车轮制造日志进行诊断

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

$ pip uninstall -y mypkg
...
Run Code Online (Sandbox Code Playgroud)

然后再次安装它,但是现在带有附加参数:

$ pip install . -vvv
...
Run Code Online (Sandbox Code Playgroud)

现在,如果我检查日志:

$ 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'
Run Code Online (Sandbox Code Playgroud)

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

缺少软件包:检查packages参数

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

from setuptools import setup

setup(
    name='mypkg',
    version='0.1',
    packages=['spam']
)
Run Code Online (Sandbox Code Playgroud)

spam将被安装,但不是spam.fizz因为它本身是软件包,所以必须明确提及。解决方法:

from setuptools import setup

setup(
    name='mypkg',
    version='0.1',
    packages=['spam', 'spam.fizz']
)
Run Code Online (Sandbox Code Playgroud)

如果您有很多软件包,请使用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']
)
Run Code Online (Sandbox Code Playgroud)

如果您缺少模块:

缺少模块:检查py_modules参数

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

from setuptools import find_packages, setup

setup(
    name='mypkg',
    version='0.1',
    packages=find_packages(),
    py_modules=['bacon']
)
Run Code Online (Sandbox Code Playgroud)

缺少数据文件:检查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']
)
Run Code Online (Sandbox Code Playgroud)

不要试图使用该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'
Run Code Online (Sandbox Code Playgroud)

它们也将在属于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
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案!谢谢。 (4认同)
  • 您是否正在尝试导入发行版名称(设置脚本中的“name”参数下的名称)或包名称之一(“packages”参数下的名称)?您无法导入发行版名称。总的来说,这是一个与此无关的问题,我建议改问另一个问题。 (3认同)
  • 另一个常见的错误来源:每个包都必须有一个 `__init__.py` 文件,以便 setuptools 找到它。如果您习惯于使用开发安装(`-e`),那么很容易忘记这一点,而开发安装不需要这样做。 (3认同)

小智 0

如果您使用的是 Windows 10+,确保安装正确的一种方法是单击左下角的“开始”并搜索 cmd.exe,然后右键单击“命令提示符”(确保您选择“以管理员身份运行”)。输入“cd path to your Python 3.X installation”。您可以在文件资源管理器中找到此路径(转到安装 Python 的文件夹),然后在顶部找到该路径。复制这个,然后把它放在我上面写的地方path to your Python 3.X installation。完成此操作并单击 Enter 后,输入“python -m pip install package”(package表示您要安装的包)。您的 Python 程序现在应该可以完美运行。