首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scikit-构建纯Python包

Scikit-构建纯Python包
EN

Stack Overflow用户
提问于 2020-12-11 18:37:05
回答 2查看 270关注 0票数 1

我想要创建我自己的Python包,它应该可以从包含setup.py的目录中使用pip install .进行pip安装。我还想使用scikit-build和CMake来使这段代码与将来可能的修改兼容,从而使它可以与Cython一起运行。

测试示例如下:

代码语言:javascript
复制
Directory structure
.
|_lib
|    |_skbuild_test_lib
|    |                 |_ CMakeLists.txt
|    |                 |_ __init__.py
|    |                 |_ lib.py
|    |_ CMakeLists.txt
|    |_ __init__.py
|    |_ skbuild_test.py
|_ CMakeLists.txt
|_ main.py
|_ setup.py

__init__.py文件都是空的,其他文件如下:

setup.py:

代码语言:javascript
复制
from skbuild import setup

setup(
    name='skbuild_test',
    version='0.0.1',
    packages=['lib', 'lib.skbuild_test_lib'],
)

main.py:

代码语言:javascript
复制
import skbuild_test

skbuild_test.hello_world()

CMakeLists.txt:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.0.0)
project(skbuild_test VERSION 0.1.0)

add_subdirectory (lib)

lib/CMakeLists.txt:

代码语言:javascript
复制
add_subdirectory (skbuild_test_lib)

install (FILES __init__.py DESTINATION skbuild_test)
install (FILES skbuild_test.py DESTINATION skbuild_test)

lib/skbuild_test.py:

代码语言:javascript
复制
import lib

def hello_world():
    print(lib.foo())

lib/skbuild_test/CMakeLists.py:

代码语言:javascript
复制
install (FILES __init__.py DESTINATION skbuild_test)
install (FILES lib.py DESTINATION skbuild_test)

lib/skbuild_test/lib.py:

代码语言:javascript
复制
def foo():
    return 'Hello World!'

具有这种结构的存储库可以在here中找到。

我试图实现的是让setup.py在lib文件夹中安装所有内容,然后让main.py文件能够运行。我运行python setup.py install时的代码抛出(在我的Windows10系统上)以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "setup.py", line 6, in <module>
    packages=['lib', 'lib.skbuild_test_lib'],
  File "venv\lib\site-packages\skbuild\setuptools_wrap.py", line 625, in setup
    cmake_source_dir, skbuild_kw['cmake_install_dir'])
  File "venv\lib\site-packages\skbuild\setuptools_wrap.py", line 757, in _classify_installed_files
    install_root, to_platform_path(path)))
skbuild.exceptions.SKBuildError:
  CMake-installed files must be within the project root.
    Project Root  : skbuild_test\_skbuild\win-amd64-3.7\cmake-install
    Violating File: skbuild_test\_skbuild\win-amd64-3.7\cmake-install\skbuild_test\__init__.py

请注意,如果我改为运行命令pip install .,我不会得到任何错误,但是包没有正确安装,并且main.py将抛出错误。

EN

回答 2

Stack Overflow用户

发布于 2020-12-31 09:25:11

首先,我认为你把事情搞得太复杂了,也就是说,你没有cmake要构建的东西,那么为什么你一开始就使用scikit-build呢?

其次,我最近一直在使用cmake/scikit-build/other进行“测试”,并没有声称自己是这方面的专家,但我认为你的setup.py目标找错了方向。我的意思是,这不是setup.py的工作,相反,你可能应该使用cmake (尽管我不确定我是否明白这一点)。setup.py和cmake对安装都有自己的想法,并且在构建(某些东西)之后倾向于使用cmake install命令。

如果您想查看使用cython扩展的真实示例,可以查看此处:https://github.com/freepn/py-re2/tree/skbuild

票数 0
EN

Stack Overflow用户

发布于 2020-12-31 20:56:06

我想我设法找到了一种方法来让它发挥作用。要查看我的存储库的情况,可以查看solution branch中已经引用的CMakeLists.txt

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65249702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档