python安装wheel导致导入错误

问题描述 投票:0回答:5

我想制作一个wheel二进制发行版,安装它,然后将其导入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 文件中指定的目录。

python-3.x pip python-wheel
5个回答
4
投票

我有同样的错误,但这是由于我的 setup.py 没有指定条目“packages=setuptools.find_packages()”。 如果没有它,一切都可以很好地构建,但是即使 pip 显示它已安装,您也无法导入任何内容。


1
投票

如果您需要从另一个目录执行安装脚本,请确保在脚本中输入项目目录。

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

0
投票

就我而言,为了解决这个问题,我只需要升级 pip(因为 Docker 安装了 pip 9)。

python3 -m pip install --upgrade pip

0
投票

我也经历过同样的情况,可能原因不一样,这里仅供参考。 包名不能包含破折号“-”,不会弹出错误,但是安装好wheel后,虽然显示在pip list中,但是找不到那个包。

/src/your-package-name # 不应该

/src/your_package_name # 应该像这样

在setup.py中,可以无限制地使用带破折号“-”的名称:

setuptools.setup(
name="instrument-lab",
...

0
投票

如果有人将

pyproject.toml
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 安装的 Wheel 的名称(即源自“myproject”),并且

pip list
随后简单地显示为“myproject”,而不是可导入包(即“mypackage”) .

© www.soinside.com 2019 - 2024. All rights reserved.