web-dev-qa-db-ja.com

pip install。パッケージではなく、dist-infoのみを作成します

_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'
    ],

)
_
23
André Betz

この質問は非常に一般的になっているため、インストール後にファイルが欠落している場合の診断手順を次に示します。次の構造を持つサンプルプロジェクトがあるとします。

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.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

それでは、今何をすべきか?

ホイールビルドログを調べて診断する

そうしないように指示されない限り、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引数をセットアップ関数に渡したことを確認してください。インストールするパッケージのallに言及していることを確認してください。親パッケージのみが言及されている場合、サブパッケージは自動的に収集されません!たとえば、セットアップスクリプトで

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
15
hoefling

Windows 10以降を使用している場合は、すべてのインストールが正しいことを確認する1つの方法は、左下隅の[開始]をクリックして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プログラムは完全に動作するはずです。

0
Arnav Poddar