2016-07-22 47 views
5

Python modülünden paylaşılan bir nesne oluşturmak için Cython kullanıyorum. Derleme çıktısı build/lib.linux-x86_64-3.5/<Package>/<module>.cpython-35m-x86_64-linux-gnu.so'a yazılmıştır. Adlandırma kuralını değiştirmek için herhangi bir seçenek var mı? Dosyayı, yorumlayıcı sürümü veya ark eki olmadan <module>.so olarak adlandırılmasını istiyorum.Cython'un .so dosyaları için adlandırma kurallarını değiştir

+0

yapabilirsiniz, aynı olmalıdır python kurulumunu bulun.py --help – YOU

+0

@YO U: Teşekkürler, build/lib/temp dizinlerini geçersiz kılmayı başardım, ancak platform eki vb. Ile ilgili hiçbir şey göremiyorum. – hoefling

+0

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

cevap

4

setuptools, son ekini tamamen değiştirmek veya kaldırmak için seçenek sunmuyor gibi görünüyor. Sihirli distutils/command/build_ext.py olur: Ben bir post-build yeniden adlandırma eylemi eklemeniz gerekecektir gibi

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 

görünüyor. 08/12/2016 den


Güncelleme:

Tamam, ben aslında çözüm göndermek için unuttum. Aslında, yerleşik install_lib komutunu aşırı yükleyerek yeniden adlandırma eylemi gerçekleştirdim. setup işlevinde komutu aşırı Şimdi yapmanız gereken tek şey

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] 

edilir: Burada mantık var Hala

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

, ben standart komutları aşırı memnun değilim; Daha iyi bir çözüm bulursanız, gönderin ve cevabınızı kabul edeceğim.

2

Bu davranış dağıtım paketinde tanımlanmıştır. "EXT_SUFFIX" değişken örneğin," .cp35-win_amd64" platformu bilgileri içerir

# 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 

Python 3.5 ile başlayan: distutils sysconfig ve "EXT_SUFFIX" yapılandırma değişkeni kullanır. komuta build_ext

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 

Ve özel :

Aşağıdaki fonksiyonu yazdım

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) 

Kullanımı: Setuptools seçenekleri oluşturdukça

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

Kodunuz bana yardımcı oldu. Teşekkür ederim! – q0987

İlgili konular