簡體   English   中英

pip 安裝。 僅創建 dist-info 而不是 package

[英]pip install . creates only the dist-info not the package

我正在嘗試制作一個 python package,我想使用pip install. 本地。 package 名稱列在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'
    ],

)

由於這個問題已經變得非常流行,以下是安裝后丟失文件時要執行的診斷步驟。 想象一下有一個具有以下結構的示例項目:

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 ,也看不到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將始終嘗試構建一個輪文件並從中安裝您的包。 如果在詳細模式下重新安裝,我們可以檢查輪子構建過程的日志。 第一步是卸載軟件包:

$ 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參數傳遞給設置函數。 檢查您是否提到了應該安裝的所有軟件包。 如果只提到父包,將不會自動收集子包! 例如,在安裝腳本中

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

如果您使用的是 Windows 10+,則可以確保您擁有所有正確安裝的一種方法是單擊左下角的開始並搜索 cmd.exe 並右鍵單擊“命令提示符”(確保您選擇“以管理員身份運行”)。 輸入“ path to your Python 3.X installation cd path to your Python 3.X installation ”。 您可以在文件資源管理器中找到此路徑(轉到安裝 Python 的文件夾),然后在頂部找到。 復制這個,然后把它放在我上面寫path to your Python 3.X installation 執行此操作並單擊 Enter 后,鍵入“python -m pip install package ”( package表示您要安裝的包)。 您的 Python 程序現在應該可以完美運行。

對我來說,如果你這樣做,我會注意到一些奇怪的事情:

# Not in the setup.py directory
python /path/to/folder/setup.py bdist_wheel

當您安裝輪子時,它只會在您的站點包文件夾中安裝 .dist-info 文件夾。

但是,如果您這樣做:

cd /path/to/folder \
&& python setup.py bdist_wheel

輪子將包含您的所有文件。

我遇到了同樣的問題,更新setuptools幫助:

python3 -m pip install --upgrade pip setuptools wheel

之后,重新安裝 package,它應該可以正常工作:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM