2017-06-02 3 views
0

私は、C++の拡張子を持つpythonパッケージを作成しています。私はsetuptoolsでこれをやってみようとしていますが、これは推奨される解決策です。それがsetup_requires、install_requiresを許すとすれば、私は同意して、私のpythonパッケージのみに使用します。しかし、私はC++拡張モジュールを持っているときに動作させることができません。それから、私はdistutils.coreを利用して動作させます。私はそれをsetuptoolsを使って動作させる方法を知りたいです。マイセットアップスクリプトがdistutils.core vs setuptools with C++ extension

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ファイルになります。パッケージは、インストールフォルダから使用した場合にのみ動作します。代わりに、サイト内の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} 
    ) 

私は(.soのファイルで)package_pyフォルダを取得し、package_py-0.0.1-py3.6.egg-情報のdistutils.coreを使用する最初の行を変更する

パッケージ。これで、モジュールはすべてのフォルダで動作します。

私もsetup_requires、私は本当にsetuptoolsのを使用したいinstal_requiresを使用するPythonパッケージを拡張したいと。どのように私は、パッケージはsetuptoolsのを使用してすべてのフォルダで動作するように取得することができます代わりにdistutils.core

答えて

0

のあなたは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'] 
    ) 

・ホープ、このことができますか、少なくとも右のトラックにあなたを取得:

はこのような何かを試してみてください。