2013-07-23 11 views
27

का उपयोग करके एक पायथन स्क्रिप्ट पोस्ट इंस्टॉल निष्पादित करें, मैं How to extend distutils with a simple post install script? में वर्णित पाइथन डिस्ट्यूटल्स पर पोस्ट-इंस्टॉल कार्य जोड़ने का प्रयास कर रहा हूं। कार्य को स्थापित lib निर्देशिका में एक पायथन स्क्रिप्ट निष्पादित करना है। यह स्क्रिप्ट स्थापित पाइथन मॉड्यूल को स्थापित पैकेज की आवश्यकता होती है।distutils/setuptools

from distutils.core import setup 
from distutils.command.install import install 

class post_install(install): 
    def run(self): 
     install.run(self) 
     from subprocess import call 
     call(['python', 'scriptname.py'], 
      cwd=self.install_lib + 'packagename') 

setup(
... 
cmdclass={'install': post_install}, 
) 

यह दृष्टिकोण से काम करता है, लेकिन जहाँ तक मैं बता सकता हूँ दो तत्वों की कमी है:: उपयोगकर्ता एक अजगर के अलावा अन्य दुभाषिया का इस्तेमाल किया गया है, तो

  1. मेरा पहला प्रयास इस प्रकार है PATH से उठाया गया, पोस्ट इंस्टॉल स्क्रिप्ट अलग दुभाषिया के साथ निष्पादित की जाएगी जो किसी समस्या का कारण बन सकती है।

  2. यह ड्राई-रन इत्यादि के खिलाफ सुरक्षित नहीं है, जिसे मैं इसे एक फ़ंक्शन में लपेटकर और distutils.cmd.Command.execute के साथ कॉल करके उपाय कर सकता हूं।

मैं अपना समाधान कैसे सुधार सकता हूं? क्या ऐसा करने के लिए कोई अनुशंसित तरीका/सर्वोत्तम अभ्यास है? यदि संभव हो तो मैं एक और निर्भरता में खींचने से बचना चाहता हूं।

+0

उन लोगों के लिए जो 'python setup.py install' का उपयोग करने में सक्षम होना चाहते हैं, साथ ही' पाइप इंस्टॉल ', देखें: http://stackoverflow.com/questions/21915469/python-setuptools-install-requires -इस-अनदेखा-जब-ओवरराइडिंग- cmdclass –

उत्तर

34

तरह से इन deficiences संबोधित करने के लिए है:

  1. अजगर दुभाषिया sys.executable से setup.py क्रियान्वित करने के लिए पूरा पथ प्राप्त करें।
  2. क्लासेस distutils.cmd.Command (जैसे जो हम यहाँ का उपयोग distutils.command.install.install) से इनहेरिट execute विधि है, जो एक "सुरक्षित तरीके से" यानी सूखी रन ध्वज का सम्मान में दिए गए फ़ंक्शन निष्पादित लागू।

    नोट हालांकि the --dry-run option is currently broken और वैसे भी वैसे भी काम नहीं करता है।

मैं निम्नलिखित समाधान के साथ समाप्त हो गया:

import os, sys 
from distutils.core import setup 
from distutils.command.install import install as _install 


def _post_install(dir): 
    from subprocess import call 
    call([sys.executable, 'scriptname.py'], 
     cwd=os.path.join(dir, 'packagename')) 


class install(_install): 
    def run(self): 
     _install.run(self) 
     self.execute(_post_install, (self.install_lib,), 
        msg="Running post install task") 


setup(
    ... 
    cmdclass={'install': install}, 
) 

नोट है कि मैं अपने व्युत्पन्न वर्ग के लिए वर्ग के नाम install उपयोग करें, क्योंकि वह यह है कि क्या python setup.py --help-commands का प्रयोग करेंगे।

+0

धन्यवाद, यह वास्तव में मदद करता है, मुझे भी पालन करने की आवश्यकता है (http://stackoverflow.com/questions/15853058/run-custom-task-when-call-pip-install) मेरे पाइप इंस्टॉल में एक त्रुटि से बचने के लिए। मैंने इसे ब्लॉग पोस्ट में एक साथ रखा है (http://diffbrent.ghost.io/correctly-adding-nltk-to-your-python-package-using-setup-py-post-install-commands/)। अगर मुझे कुछ याद आया तो मुझे बताएं। –

+0

@ brent.payne यह सुनकर खुशी हुई! मेरी टिप्पणी पर ध्यान दें कि मैंने क्लास नाम के रूप में 'इंस्टॉल' क्यों उपयोग किया। – kynan

+1

यह काम करता है, लेकिन मैं 'पाइप इंस्टॉल-नाम' के साथ निष्पादित कस्टम इंस्टॉल करने में सक्षम नहीं था। पीएस, बस पाया [यह लिंक] (http://www.niteoweb.com/blog/setuptools-run- कस्टम-code-during-install), बोनस अनुभाग देखें। – Paolo