运行 pip install 两次以查看更改 ("developer mode") -- 第二次安装失败但第一次安装成功

Running pip install twice to see changes ("developer mode") -- second install fails but first works

我想知道如何使用 pip 开发一个 Python 包,该包正在快速进行许多修订。我的工作流程是编写 C++ 代码,使用 pip install 编译和安装并测试我的代码。

然后,我想更改一些底层 C++ 代码,重新编译并使用 pip 重新安装,测试新功能,更改其他内容,返回等等,直到我的包准备就绪。

为什么pip install ./cmake_example第一次用的很好,改代码的时候,重新安装重新编译就报错了?我只是重新 运行 命令 pip install ./cmake_example.

我以一种无害的方式更改了一行 C++ 代码(在 'add' 函数中添加 +1 只是为了看看我是否可以更改代码并重新编译)并且代码在我的 IDE 没有 pip。

我的基本想法是在 之后使用 pip 以避免每次我进行更改时不得不将我的共享对象 hackishly 插入到某个 python 目录中。

我使用了 pybind here 中的 cmake_example 并按照步骤进行了 pip install ./cmake_example 并且效果很好。我 运行 这个例子在 Python 控制台中很好。

然后,我更改了一些代码(只是在添加函数中添加了 +1),所以没什么实质性的,想要 re-install 包。

然后我得到这个错误:

Building wheels for collected packages: cmake-example
  Building wheel for cmake-example (pyproject.toml) ... error
  error: subprocess-exited-with-error

  × Building wheel for cmake-example (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [65 lines of output]
      running bdist_wheel
      running build
      running build_ext
      CMake Error at CMakeLists.txt:2 (project):
        Running

         '/tmp/pip-build-env-q_8_pyjk/overlay/bin/ninja' '--version'

        failed with:

         No such file or directory

ERROR: Could not build wheels for cmake-example, which is required to
install pyproject.toml-based projects

我试过 pip uninstall cmake_example 然后重新安装,但无济于事。 upgrade 函数也不起作用。 pip 是否更改了项目文件夹中的某些内容?

PS: pybind11 的制造商还提供了一个 scikit 示例 here,其中不需要为重复构建删除缓存。 cmake_example 似乎适用于不使用 cmake 扩展 scikit 的遗留项目。因此,如果 cmake_example 的结构对项目至关重要,那么删除缓存是唯一的方法。

我发现删除 cmake_example 目录中的 build 目录解决了问题,并且 pip install ./cmake_example 再次像第一次一样工作。您可以组合这两个命令:

rm -rf ./cmake_example/build && pip install ./cmake_example

仔细看,(对我来说)删除cmake_example/temp.linux-x86_64-3.8/CMakeCache.txt就足够了。我怀疑线条

//Program used to build from build.ninja files.
CMAKE_MAKE_PROGRAM:FILEPATH=/tmp/pip-build-env-yqopewjn/overlay/bin/ninja

inside CMakeCache.txt 意味着 cmake 缓存了 ninja 可执行文件的路径,但是第二次临时路径不同,所以再也找不到 cmake期待它。