2016-07-22 10 views
5

私はCythonを使ってPythonモジュールから共有オブジェクトを生成しています。コンパイル出力はbuild/lib.linux-x86_64-3.5/<Package>/<module>.cpython-35m-x86_64-linux-gnu.soに書き込まれます。名前付けルールを変更するオプションはありますか?ファイルの名前を<module>.soとし、インタプリタのバージョンやアーチの付録を付けないでください。.soファイルのCythonの命名規則を変更する

+0

をすることができます、同じである必要がありますPythonでそれを見つけるsetup.py --help – YOU

+0

@YO U:ありがとう、ビルド/ lib/tempディレクトリをオーバーライドすることができましたが、プラットフォームのサフィックスなどに関連するものは何も表示されません。 – hoefling

+0

'python setup.py build --build-platlib ' – YOU

答えて

4

setuptoolsのように見えますが、接尾辞を完全に変更または削除するオプションはありません。魔法がdistutils/command/build_ext.pyで起こる:私は、ビルド後の名前変更アクションを追加する必要がありますように

def get_ext_filename(self, ext_name): 
    from distutils.sysconfig import get_config_var 
    ext_path = ext_name.split('.') 
    ext_suffix = get_config_var('EXT_SUFFIX') 
    return os.path.join(*ext_path) + ext_suffix 

思えます。 2016年8月12日から


更新:

[OK]を、私は実際にソリューションを投稿するのを忘れました。実際には、組み込みのinstall_libコマンドをオーバーロードすることによって名前変更アクションを実装しました。 setup機能でコマンドをオーバーロードするために今あなたがしなければならないすべての

from distutils.command.install_lib import install_lib as _install_lib 

def batch_rename(src, dst, src_dir_fd=None, dst_dir_fd=None): 
    '''Same as os.rename, but returns the renaming result.''' 
    os.rename(src, dst, 
       src_dir_fd=src_dir_fd, 
       dst_dir_fd=dst_dir_fd) 
    return dst 

class _CommandInstallCythonized(_install_lib): 
    def __init__(self, *args, **kwargs): 
     _install_lib.__init__(self, *args, **kwargs) 

    def install(self): 
     # let the distutils' install_lib do the hard work 
     outfiles = _install_lib.install(self) 
     # batch rename the outfiles: 
     # for each file, match string between 
     # second last and last dot and trim it 
     matcher = re.compile('\.([^.]+)\.so$') 
     return [batch_rename(file, re.sub(matcher, '.so', file)) 
       for file in outfiles] 

されています:ここでは、論理だそれでも

setup(
    ... 
    cmdclass={ 
     'install_lib': _CommandInstallCythonized, 
    }, 
    ... 
) 

、私は標準のコマンドをオーバーロードに満足していませんよ。あなたがより良い解決策を見つけたらそれを掲示し、私はあなたの答えを受け入れます。

2

この動作はdistutilsパッケージで定義されています。 Pythonの3.5 "EXT_SUFFIX" 変数は、例えば、プラットフォーム情報が含まれている」.cp35-win_amd64" を皮切り

# Lib\distutils\command\build_ext.py 

def get_ext_filename(self, ext_name): 
    r"""Convert the name of an extension (eg. "foo.bar") into the name 
    of the file from which it will be loaded (eg. "foo/bar.so", or 
    "foo\bar.pyd"). 
    """ 
    from distutils.sysconfig import get_config_var 
    ext_path = ext_name.split('.') 
    ext_suffix = get_config_var('EXT_SUFFIX') 
    return os.path.join(*ext_path) + ext_suffix 

:distutilsのはのsysconfigと "EXT_SUFFIX" 設定変数を使用しています。

私は次の関数を書かれている:

def get_ext_filename_without_platform_suffix(filename): 
    name, ext = os.path.splitext(filename) 
    ext_suffix = sysconfig.get_config_var('EXT_SUFFIX') 

    if ext_suffix == ext: 
     return filename 

    ext_suffix = ext_suffix.replace(ext, '') 
    idx = name.find(ext_suffix) 

    if idx == -1: 
     return filename 
    else: 
     return name[:idx] + ext 

とカスタムにbuild_extコマンド:

from Cython.Distutils import build_ext 

class BuildExtWithoutPlatformSuffix(build_ext): 
    def get_ext_filename(self, ext_name): 
     filename = super().get_ext_filename(ext_name) 
     return get_ext_filename_without_platform_suffix(filename) 

使用法:setuptoolsのは、ビルドオプションとして

setup(
    ... 
    cmdclass={'build_ext': BuildExtWithoutPlatformSuffix}, 
    ... 
) 
+0

あなたのコードは私を助けました。ありがとうございました! – q0987