【问题标题】:distutils.core vs setuptools with c++ extensiondistutils.core 与带有 c++ 扩展的 setuptools
【发布时间】:2017-11-03 13:02:05
【问题描述】:

我正在创建一个带有 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,所以我想真正使用 setuptools。如何使用 setuptools 而不是 distutils.core 让包在所有文件夹中工作

【问题讨论】:

    标签: python c++ setuptools distutils


    【解决方案1】:

    如果您使用的是 C 扩展,您也应该使用 Extension 来自 setuptoolsdistutils,它不是 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']
        )
    

    希望这有助于或至少让您走上正轨。

    【讨论】:

      猜你喜欢
      • 2018-12-29
      • 2018-05-10
      • 2012-08-02
      • 1970-01-01
      • 2019-01-19
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多