distutils.core 与带有 C++ 扩展的设置工具对比
distutils.core vs setuptools with c++ extension
我正在创建一个带有 c++ 扩展的 python 包。我正在尝试使用 setuptools 来执行此操作,因为这似乎是首选解决方案。鉴于它允许 setup_requires、install_requires,我同意并将其用于我的 python 包。但是,当我有一个 c++ 扩展模块时,我无法让它工作。然后我诉诸 distutils.core 让它工作。我想知道如何使用 setuptools 让它工作。我的设置脚本看起来像
from setuptools import setup
import shutil
import os
# folder where .so is being build by cpp compilation
so_src = os.path.join(dir, 'cpp/build/')
# folder where .so should live in python package
so_des = os.path.join(dir, 'package_py/cpp/')
# extension module
lib_files = ['cpp_py.so']
# copy shared lib
for f in lib_files:
shutil.copyfile(so_src + f, so_des + f)
# set-up script
setup(
name=DISTNAME
, version=FULLVERSION
, description= DESCRIPTION
, author= AUTHOR
, author_email= EMAIL
, maintainer= AUTHOR
, maintainer_email= EMAIL
, long_description=LONG_DESCRIPTION
, packages=['package_py',
'package_py.cpp']
, package_dir={'package_py.cpp': 'package_py/cpp'}
, package_data={'package_py.cpp': lib_files}
)
这会在我的 python 站点包中生成一个 package_py-0.0.1-py3.6.egg 文件。软件包 仅 在安装文件夹中使用时有效。
更改第一行以使用 distutils.core 而不是 setuptools
from distutils.core import setup # only change, remainder is the same!!
import shutil
import os
# folder where .so is being build by cpp compilation
so_src = os.path.join(dir, 'cpp/build/')
# folder where .so should live in python package
so_des = os.path.join(dir, 'package_py/cpp/')
# extension module
lib_files = ['cpp_py.so']
# copy shared lib
for f in lib_files:
shutil.copyfile(so_src + f, so_des + f)
# set-up script
setup(
name=DISTNAME
, version=FULLVERSION
, description= DESCRIPTION
, author= AUTHOR
, author_email= EMAIL
, maintainer= AUTHOR
, maintainer_email= EMAIL
, long_description=LONG_DESCRIPTION
, packages=['package_py',
'package_py.cpp']
, package_dir={'package_py.cpp': 'package_py/cpp'}
, package_data={'package_py.cpp': lib_files}
)
我在站点包中得到一个 package_py 文件夹(带有 .so 文件)和 package_py-0.0.1-py3.6.egg-info。现在该模块适用于所有文件夹。
因为我想扩展 python 包以也使用 setup_requires,instal_requires 我想真正使用 setuptools。如何使用 setuptools 而不是 distutils.core
让包在所有文件夹中工作
如果你使用的是 C 扩展,你也应该使用 setuptools
或 distutils
中的 Extension
,它不是 python 包,所以我很惊讶它甚至设法安装。如果您打算将软件包分发给其他人,则不应事先编译扩展,而应在软件包安装期间对其进行编译,以便用户的系统对其进行适当的编译(即,.so
文件无助于Windows 需要它的用户编译成 .dll
文件等)。
尝试这样的事情:
from setuptools import setup, Extension
import shutil
import os
# I don't know how you want to build your extension or your file structure,
# so removing the build stuff.
your_modulename=Extension('_extensionname',
sources=['path/to/extension.cpp', 'more/file/paths'],
language='c'
)
# set-up script
setup(
name=DISTNAME
, version=FULLVERSION
, description= DESCRIPTION
, author= AUTHOR
, author_email= EMAIL
, maintainer= AUTHOR
, maintainer_email= EMAIL
, long_description=LONG_DESCRIPTION
, ext_modules=[your_modulename]
, packages=['package_py']
)
希望这对您有所帮助,或者至少让您走上正轨。
我正在创建一个带有 c++ 扩展的 python 包。我正在尝试使用 setuptools 来执行此操作,因为这似乎是首选解决方案。鉴于它允许 setup_requires、install_requires,我同意并将其用于我的 python 包。但是,当我有一个 c++ 扩展模块时,我无法让它工作。然后我诉诸 distutils.core 让它工作。我想知道如何使用 setuptools 让它工作。我的设置脚本看起来像
from setuptools import setup
import shutil
import os
# folder where .so is being build by cpp compilation
so_src = os.path.join(dir, 'cpp/build/')
# folder where .so should live in python package
so_des = os.path.join(dir, 'package_py/cpp/')
# extension module
lib_files = ['cpp_py.so']
# copy shared lib
for f in lib_files:
shutil.copyfile(so_src + f, so_des + f)
# set-up script
setup(
name=DISTNAME
, version=FULLVERSION
, description= DESCRIPTION
, author= AUTHOR
, author_email= EMAIL
, maintainer= AUTHOR
, maintainer_email= EMAIL
, long_description=LONG_DESCRIPTION
, packages=['package_py',
'package_py.cpp']
, package_dir={'package_py.cpp': 'package_py/cpp'}
, package_data={'package_py.cpp': lib_files}
)
这会在我的 python 站点包中生成一个 package_py-0.0.1-py3.6.egg 文件。软件包 仅 在安装文件夹中使用时有效。
更改第一行以使用 distutils.core 而不是 setuptools
from distutils.core import setup # only change, remainder is the same!!
import shutil
import os
# folder where .so is being build by cpp compilation
so_src = os.path.join(dir, 'cpp/build/')
# folder where .so should live in python package
so_des = os.path.join(dir, 'package_py/cpp/')
# extension module
lib_files = ['cpp_py.so']
# copy shared lib
for f in lib_files:
shutil.copyfile(so_src + f, so_des + f)
# set-up script
setup(
name=DISTNAME
, version=FULLVERSION
, description= DESCRIPTION
, author= AUTHOR
, author_email= EMAIL
, maintainer= AUTHOR
, maintainer_email= EMAIL
, long_description=LONG_DESCRIPTION
, packages=['package_py',
'package_py.cpp']
, package_dir={'package_py.cpp': 'package_py/cpp'}
, package_data={'package_py.cpp': lib_files}
)
我在站点包中得到一个 package_py 文件夹(带有 .so 文件)和 package_py-0.0.1-py3.6.egg-info。现在该模块适用于所有文件夹。
因为我想扩展 python 包以也使用 setup_requires,instal_requires 我想真正使用 setuptools。如何使用 setuptools 而不是 distutils.core
让包在所有文件夹中工作如果你使用的是 C 扩展,你也应该使用 setuptools
或 distutils
中的 Extension
,它不是 python 包,所以我很惊讶它甚至设法安装。如果您打算将软件包分发给其他人,则不应事先编译扩展,而应在软件包安装期间对其进行编译,以便用户的系统对其进行适当的编译(即,.so
文件无助于Windows 需要它的用户编译成 .dll
文件等)。
尝试这样的事情:
from setuptools import setup, Extension
import shutil
import os
# I don't know how you want to build your extension or your file structure,
# so removing the build stuff.
your_modulename=Extension('_extensionname',
sources=['path/to/extension.cpp', 'more/file/paths'],
language='c'
)
# set-up script
setup(
name=DISTNAME
, version=FULLVERSION
, description= DESCRIPTION
, author= AUTHOR
, author_email= EMAIL
, maintainer= AUTHOR
, maintainer_email= EMAIL
, long_description=LONG_DESCRIPTION
, ext_modules=[your_modulename]
, packages=['package_py']
)
希望这对您有所帮助,或者至少让您走上正轨。