2017-06-02 1 views
0

Je crée un paquet python avec une extension C++. J'essaye de faire ceci avec setuptools car cela semble être la solution préférée. Étant donné qu'il autorise setup_requires, install_requires, je suis d'accord et l'utilise pour mes paquets python seulement. Cependant, je suis incapable de le faire fonctionner quand j'ai un module d'extension C++. Ensuite, j'ai recours à distutils.core pour le faire fonctionner. Je voudrais savoir comment le faire fonctionner en utilisant setuptools. Mon script de configuration ressembledistutils.core vs setuptools avec l'extension C++

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} 
    ) 

Il en résulte un fichier package_py-0.0.1-py3.6.egg dans mon python site-packages. Le package seulement fonctionne lorsqu'il est utilisé à partir du dossier d'installation.

Modification de la première ligne à utiliser distutils.core au lieu de 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} 
    ) 

je reçois un dossier package_py (avec .so fichier) et package_py-0.0.1-py3.6.egg-info dans le site -paquets. Maintenant, le module fonctionne dans tous les dossiers. Comme je voudrais étendre le paquet python pour utiliser aussi setup_requires, instal_requires je veux vraiment utiliser setuptools. Comment puis-je obtenir le package de travailler dans tous les dossiers à l'aide setuptools au lieu de distutils.core

Répondre

0

Si vous utilisez une extension C, vous devez utiliser Extension soit de setuptools ou distutils aussi bien, ce n'est pas un paquet python, donc Je suis surpris qu'il réussisse même à installer. Si vous envisagez de distribuer le paquet à d'autres, vous ne devez pas compiler l'extension au préalable, mais la compiler pendant l'installation du paquet afin que le système de l'utilisateur la compile correctement (un fichier .so n'aide pas un utilisateur Windows qui a besoin compilé dans un fichier .dll, etc).

Essayez quelque chose comme ceci:

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'] 
    ) 

Hope this helps ou au moins vous obtient sur la bonne voie.