Колесо установки python приводит к ошибке импорта
Я хотел бы сделать двоичный дистрибутив колеса, установить его и затем импортировать в Python. Мои шаги
- Я сначала создаю колесо:
python ./my_package/setup.py bdist_wheel
- Я устанавливаю колесо:
pip install ./dist/*.whl
- Я пытаюсь импортировать пакет:
python -c"import my_package"
Это приводит к ошибке:ImportError: No module named 'my_package'
Кроме того, когда я делаю pip list
, my_package
в списке. Тем не менее, когда я бегу which my_packge
ничего не показано.
Когда я бегу pip install ./my_package/
все работает как положено.
Как бы правильно собрать и установить колесо?
Python версия 3.5 пип версия 10.1 колесо версия 0.31.1
ОБНОВИТЬ:
Когда я просматриваю файлы внутри my_package-1.0.0.dist-info, в top_level.txt
, Это имя папки, в которой я работал python ./my_package/setup.py bdist_wheel
в. Я считаю, что мой setup.py
сломано.
ОБНОВЛЕНИЕ ОТНОСИТЕЛЬНО ПРИНЯТОГО ОТВЕТА: Я принял ответ ниже. Тем не менее, я думаю, что лучше просто cd
в каталог пакетов. Переключение на другой каталог, как предлагается ниже, приводит к неожиданному поведению при использовании -d
флаг, т.е. целевой каталог, где сохранить колесо. Это будет относительно каталога, указанного в файле setup.py.
5 ответов
Если вам нужно выполнить скрипт установки из другого каталога, убедитесь, что вы вводите dir проекта в скрипт.
from setuptools import setup
root = os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))
os.chdir(root)
# or using pathlib (Python>=3.4):
import patlib
root = pathlib.Path(__file__).parent
os.chdir(str(root))
setup(...)
У меня была такая же ошибка, но это было из-за того, что мой setup.py не указывал запись "packages=setuptools.find_packages()". Все отлично работает без этого, но вы не можете ничего импортировать, даже если pip показывает, что это установлено.
В моем случае, чтобы решить эту проблему, мне просто нужно было обновить pip (поскольку Docker установил pip 9).
python3 -m pip install --upgrade pip
В случае, если кто-то использует иsetuptools
в сочетании сsetup.py
иsetup.cfg
, в документации есть примечание, которое довольно долго от меня ускользало. Стандартные структуры каталогов для пакетов будут определяться автоматически, но если вы используете нестандартную структуру каталогов, вам может потребоваться найти пакеты или составить их явный список. Я использовал, как мне казалось, стандартную структуру каталогов, но это было не так:
/path/to/myproject/
├── mypackage/ Python package directory.
│ ├── __init__.py This makes the directory a package.
│ └── example_module.py An example module.
├── pyproject.toml Definition of build process of the package.
├── README.md README with info of the project.
└── setup.cfg Configuration details of the python package.
Что мне пришлось сделать вpyproject.toml
было либо это:
[tool.setuptools]
packages = ["mypackage"]
или это:
[tool.setuptools.packages.find]
where = ["."]
Еще одна путаница, которая может возникнуть, заключается в том, что имя колеса, установленное pip (т. е. полученное от «myproject») и котороеpip list
впоследствии отображается как просто «myproject», но не является импортируемым пакетом (т. е. «mypackage»).
У меня была такая же ситуация, может быть, не по той же причине, здесь просто для справки. Имя пакета не должно содержать тире "-", ошибка не выскочит, но после установки вашего колеса, хотя оно отображается в списке пунктов, вы не можете найти этот пакет.
/src/your-package-name # не должен
/src/your_package_name # должно понравиться
В setup.py вы можете использовать имя с дефисом "-" без ограничений:
setuptools.setup(
name="instrument-lab",
...