_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
ただし、インストールされたパッケージに属するファイルのリストで、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
それでは、今何をすべきか?
そうしないように指示されない限り、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
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プログラムは完全に動作するはずです。