我想制作一个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 文件中指定的目录。
我有同样的错误,但这是由于我的 setup.py 没有指定条目“packages=setuptools.find_packages()”。 如果没有它,一切都可以很好地构建,但是即使 pip 显示它已安装,您也无法导入任何内容。
如果您需要从另一个目录执行安装脚本,请确保在脚本中输入项目目录。
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(...)
就我而言,为了解决这个问题,我只需要升级 pip(因为 Docker 安装了 pip 9)。
python3 -m pip install --upgrade pip
我也经历过同样的情况,可能原因不一样,这里仅供参考。 包名不能包含破折号“-”,不会弹出错误,但是安装好wheel后,虽然显示在pip list中,但是找不到那个包。
/src/your-package-name # 不应该
/src/your_package_name # 应该像这样
在setup.py中,可以无限制地使用带破折号“-”的名称:
setuptools.setup(
name="instrument-lab",
...
如果有人将
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”) .