2016-07-22 7 views
5

मैं पाइथन मॉड्यूल से साझा ऑब्जेक्ट उत्पन्न करने के लिए साइथन का उपयोग कर रहा हूं। संकलन आउटपुट build/lib.linux-x86_64-3.5/<Package>/<module>.cpython-35m-x86_64-linux-gnu.so पर लिखा गया है। नामकरण नियम बदलने के लिए कोई विकल्प है? मैं चाहता हूं कि फ़ाइल को दुभाषिया संस्करण या आर्क परिशिष्ट के बिना <module>.so नाम दिया जाए।.so फ़ाइलों के लिए साइथन के नामकरण नियम बदलें

+0

एक ही होना चाहिए, आप कर सकते हैं इसे python setup.py --help – YOU

+0

@YO में ढूंढें यू: धन्यवाद, मैं बिल्ड/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/08/12 से

अद्यतन:

ठीक है, मैं वास्तव में समाधान पोस्ट करने के लिए भूल गया था। असल में, मैंने install_lib कमांड को ओवरलोड करके एक नामकरण क्रिया लागू की।

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 समारोह में आदेश ओवरलोड:: मैं मानक आदेशों अधिक भार के साथ खुश नहीं हूँ

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

फिर भी,; यहाँ तर्क है अगर आपको एक बेहतर समाधान मिल जाए, तो इसे पोस्ट करें और मैं आपका जवाब स्वीकार करूंगा।

2

यह व्यवहार distutils पैकेज में परिभाषित किया गया है। distutils sysconfig और "EXT_SUFFIX" config चर का उपयोग करता है:

# 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 

अजगर 3.5 के साथ शुरू "EXT_SUFFIX" चर मंच जानकारी, उदाहरण के लिए ".cp35-win_amd64" शामिल हैं। आदेश 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 

और कस्टम :

मैं निम्नलिखित समारोह में लिखा है

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

संबंधित मुद्दे