首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Setuptools中的Cythonize构建和交付Python模块

使用Setuptools中的Cythonize构建和交付Python模块
EN

Stack Overflow用户
提问于 2019-11-22 10:46:27
回答 2查看 558关注 0票数 1

在使用Cython和cythonize编译之后,我正在构建Python包。

下面是我的setup.py的一个示例:

代码语言:javascript
复制
from setuptools import setup, find_packages, Extension
from Cython.Build import cythonize


setup(
    name="My_Pkg",
    version="0.0",
    ext_modules=cythonize('lib/my_pkg/my_mod.py'),
)

下面是我的项目目录树的外观和示例:

代码语言:javascript
复制
.
├── lib
│   └── my_pkg
│       ├── __init__.py
│       └── my_mod.py
└── setup.py

在执行setuptools时,所有操作都很好:

代码语言:javascript
复制
MACOSX_DEPLOYMENT_TARGET=10.15.1 python setup.py build_ext bdist_wheel

我的模块被正确地转换为'.c‘,并在'build’目录中编译为'.so‘。完成所有操作后,在“dist”中创建轮子:

代码语言:javascript
复制
.
├── My_Pkg.egg-info
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   ├── dependency_links.txt
│   └── top_level.txt
├── build
│   ├── bdist.macosx-10.7-x86_64
│   ├── lib.macosx-10.7-x86_64-3.7
│   │   └── my_pkg
│   │       └── my_mod.cpython-37m-darwin.so
│   └── temp.macosx-10.7-x86_64-3.7
│       └── lib
│           └── my_pkg
│               └── my_mod.o
├── dist
│   └── My_Pkg-0.0-cp37-cp37m-macosx_10_7_x86_64.whl
├── lib
│   └── my_pkg
│       ├── __init__.py
│       ├── my_mod.c
│       └── my_mod.py
└── setup.py

我的问题是,在setuptools构建阶段,我希望'__init__.py‘也在' build’中被复制(没有被编译)。我也希望它被打包在生成的车轮中,作为发行版的一部分。

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2019-11-22 11:48:01

为了使它能够正常工作,我必须在setup中添加两个关键字参数( setup.py )

代码语言:javascript
复制
packages=["my_pkg"],
package_dir={'': 'lib'},do two things:

(您可能也可以使用find_packages。这是如何告诉setuptools它应该安装的Python包。具体来说,我们告诉它,我们有一个名为"my_pkg“的包,它应该在lib中查找它们。阅读此是distutils文档的最佳位置(setuptools构建在distutils上,但主要是记录更改)。

注意,这不包括"build“文件夹中的.py文件。这纯粹是一个临时的工作空间,因此毫无意义地将文件复制到其中是没有意义的。您不应该试图导入存储在"build“文件夹中的模块,它们包含在转盘中,这是能够分发模块的关键所在。

票数 1
EN

Stack Overflow用户

发布于 2019-11-25 10:01:17

感谢帮助表单注释和另一个职位,我提出了一个使用以下‘setup.py’的解决方案:

代码语言:javascript
复制
from setuptools import setup
from setuptools.command.build_py import build_py as build_py_orig
from Cython.Build import cythonize


class build_py(build_py_orig):

    def find_package_modules(self, package, package_dir):
        modules = super().find_package_modules(package, package_dir)
        return [(pkg, mod, file, ) for (pkg, mod, file, ) in modules if mod == '__init__']


setup(
    name="My_Pkg",
    version="0.0",
    ext_modules=cythonize('lib/my_pkg/my_mod.py'),
    packages=["my_pkg"],
    package_dir={'': 'lib'},
    cmdclass={'build_py': build_py},
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58992590

复制
相关文章

相似问题

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