2017-11-17 4 views
0

Cの関数を実行する必要のあるPythonアプリケーションを作成しました。そのために、gccを使って共有ライブラリのC関数をコンパイルし、ctypesを使ってPythonスクリプトでライブラリを呼び出しました。pipインストール時にCライブラリをコンパイル

私はpipパッケージで自分のアプリケーションをパックしようとしていますが、pipインストール時に共有ライブラリを作成する方法が見つけられませんでした。

私は、次の(setup.py)を試してみました:

from setuptools import setup 
from setuptools.command.install import install 
import subprocess 

class compileLibrary(install): 
    def run(self): 
     install.run(self) 
     command = "cd packageName" 
     command += " && git clone https://mygit.com/myAwesomeCLibrary.git" 
     command += " && gcc -my -many -options" 
    process = subprocess.Popen(command, shell=True) 
    process.wait() 

setup(
    name='packageName', 
    version='0.1', 
    packages=['packageName'], 
    install_requires=[ 
     ... 
    ], 
cmdclass={'install': compileLibrary}, 

を。これは、インストールプロセスが成功している間ピップからインストールして、共有ライブラリがないときは、python setup.py installをやったときに動作しますが、パッケージフォルダ(pythonx.x/site-packages/packageName)にあります。

私は同じ結果を持つdistutilsを使ってみました。

質問Run Makefile on pip installに基づいて、私はまた、次のsetup.pyを試してみました:ここ

​​

は私のパッケージ

packageName/ 
├── packageName/ 
│ ├── __init__.py 
│ ├── myFunctions.c 
├── MANIFEST.in 
├── README.md 
├── setup.py 

ノートのアーキテクチャです:唯一のピップでパッケージをインストールした後、Iインストールフォルダ(pythonx.x/site-packages/packageName)に__init__.py__pycache__があります。

ピップインストール中に共有ライブラリを作成してパッケージで使用するにはどうしたらいいですか?

答えて

0

数時間の研究の末、私は解決策を見つけました。主な問題があった。git cloneに関数をカスタムインストールに使用ライブラリ

  • をコンパイルするsetuptoolsから使用Extension

    • と終了でコンストラクタを呼び出すのでgit cloneは、コンパイルの前に発生します。ここで

    作業setup.pyです:

    from setuptools import setup, Extension 
    from setuptools.command.install import install 
    import subprocess 
    import os 
    
    class CustomInstall(install): 
        def run(self): 
         command = "git clone https://mygit.com/myAwesomeCLibrary.git" 
         process = subprocess.Popen(command, shell=True, cwd="packageName") 
         process.wait() 
         install.run(self) 
    
    module = Extension('packageName.library', 
            sources = ['packageName/library.c'], 
            include_dirs = ['packageName/include'], 
            extra_compile_args=['-fPIC']) 
    
    setup(
        name='packageName', 
        version='0.1', 
        packages=['packageName'], 
        install_requires=[ 
         ... 
        ], 
        cmdclass={'install': CustomInstall}, 
        include_package_data=True, 
        ext_modules=[module], 
    ) 
    
  • 0

    あなたはMANIFEST.inで共有ライブラリを追加することができます。 このように: include *.so *.dylib

    +0

    ありがとうございますが、pipインストール中にライブラリをコンパイルしたいと思います。 –

    +0

    CustomBuildではなくCustomInstallを使用します。 –

    関連する問題