在使用Cython和cythonize编译之后,我正在构建Python包。
下面是我的setup.py的一个示例:
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'),
)下面是我的项目目录树的外观和示例:
.
├── lib
│ └── my_pkg
│ ├── __init__.py
│ └── my_mod.py
└── setup.py在执行setuptools时,所有操作都很好:
MACOSX_DEPLOYMENT_TARGET=10.15.1 python setup.py build_ext bdist_wheel我的模块被正确地转换为'.c‘,并在'build’目录中编译为'.so‘。完成所有操作后,在“dist”中创建轮子:
.
├── 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’中被复制(没有被编译)。我也希望它被打包在生成的车轮中,作为发行版的一部分。
有什么想法吗?
发布于 2019-11-22 11:48:01
为了使它能够正常工作,我必须在setup中添加两个关键字参数( setup.py )
packages=["my_pkg"],
package_dir={'': 'lib'},do two things:(您可能也可以使用find_packages。这是如何告诉setuptools它应该安装的Python包。具体来说,我们告诉它,我们有一个名为"my_pkg“的包,它应该在lib中查找它们。阅读此是distutils文档的最佳位置(setuptools构建在distutils上,但主要是记录更改)。
注意,这不包括"build“文件夹中的.py文件。这纯粹是一个临时的工作空间,因此毫无意义地将文件复制到其中是没有意义的。您不应该试图导入存储在"build“文件夹中的模块,它们包含在转盘中,这是能够分发模块的关键所在。
发布于 2019-11-25 10:01:17
感谢帮助表单注释和另一个职位,我提出了一个使用以下‘setup.py’的解决方案:
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},
)https://stackoverflow.com/questions/58992590
复制相似问题