python Distutils/setuptools का उपयोग कर एक पायथन स्क्रिप्ट पोस्ट इंस्टॉल निष्पादित करें




install post-install (2)

इन कमियों को दूर करने का तरीका यह है:

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

    ध्यान दें कि - --dry-run विकल्प वर्तमान में टूटा हुआ है और वैसे भी वैसे भी काम नहीं करता है।

मैं निम्नलिखित समाधान के साथ समाप्त हुआ:

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 का उपयोग करेगा।

https://code.i-harness.com

मैं एक आसान पोस्ट इंस्टॉल स्क्रिप्ट के साथ distutils का विस्तार करने के तरीके में वर्णित Python distutils के लिए एक पोस्ट-स्थापित कार्य जोड़ने की कोशिश कर रहा हूँ ? । कार्य स्थापित lib निर्देशिका में एक पायथन स्क्रिप्ट निष्पादित करने के लिए माना जाता है। यह स्क्रिप्ट स्थापित पाइथन मॉड्यूल को स्थापित पैकेज की आवश्यकता होती है।

मेरा पहला प्रयास निम्नानुसार है:

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 कॉल करके इसे हल करने में सक्षम हो सकता हूं।

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


मुझे लगता है कि पोस्ट-इंस्टॉलेशन करने और आवश्यकताओं को रखने का सबसे आसान तरीका है, कॉल को setup(...) करने के लिए सजाने के लिए setup(...) :

from setup tools import setup


def _post_install(setup):
    def _post_actions():
        do_things()
    _post_actions()
    return setup

setup = _post_install(
    setup(
        name='NAME',
        install_requires=['...
    )
)

setup() घोषणा करते समय यह setup setup() चलाएगा। एक बार आवश्यकता स्थापना के साथ किया जाता है, यह _post_install() फ़ंक्शन _post_install() , जो आंतरिक फ़ंक्शन _post_actions()





post-install