python - पाइथन सेटप्टूल के साथ स्क्रिप्ट स्थापित करें




setuptools software-distribution (4)

क्या सेटपूल सेटअप सेटअपहोम फ़ाइल के हिस्से के रूप में एक पोस्ट-इंस्टाल पाइथन स्क्रिप्ट फ़ाइल को निर्दिष्ट करना संभव है, ताकि उपयोगकर्ता इसे व्यवस्थित कर सकें

python setup.py install

स्थानीय प्रोजेक्ट फ़ाइल संग्रह पर, या

pip install <name>

एक PyPI प्रोजेक्ट के लिए और स्क्रिप्ट मानक setuptools स्थापित के पूरा होने पर चलाया जाएगा? मैं पोस्ट-इंस्टॉल कार्यों को करने के लिए देख रहा हूं, जिन्हें एक एकल पायथन स्क्रिप्ट फ़ाइल में कोडित किया जा सकता है (उदाहरण के लिए उपयोगकर्ता को एक कस्टम पोस्ट-इंस्टॉल संदेश वितरित करें, एक अलग दूरस्थ स्रोत रिपॉजिटरी से अतिरिक्त डेटा फ़ाइलों को खींचें)।

मैं इस SO उत्तर से कई साल पहले आया था जो विषय को संबोधित करता है और ऐसा लगता है जैसे उस समय सर्वसम्मति थी कि आपको एक स्थापित उपसमूह बनाने की आवश्यकता है। यदि ऐसा अभी भी होता है, तो क्या किसी के लिए यह उदाहरण देना संभव होगा कि ऐसा कैसे किया जाए ताकि उपयोगकर्ता के लिए स्क्रिप्ट चलाने के लिए दूसरी कमांड दर्ज करना आवश्यक न हो?


@ अपाला, @Zulu और @mertyildiran से उत्तरों को मिलाकर; इसने पायथन 3.5 वातावरण में मेरे लिए काम किया:

import atexit
import os
import sys
from setuptools import setup
from setuptools.command.install import install

class CustomInstall(install):
    def run(self):
        def _post_install():
            def find_module_path():
                for p in sys.path:
                    if os.path.isdir(p) and my_name in os.listdir(p):
                        return os.path.join(p, my_name)
            install_path = find_module_path()

            # Add your post install code here

        atexit.register(_post_install)
        install.run(self)

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

यह आपको कुछ खोल कार्य करने के लिए, install_path में पैकेज के संस्थापन पथ तक पहुँच देता है।


इसका समाधान post_setup.py निर्देशिका में post_setup.py शामिल करना हो सकता है। post_setup.py में एक फ़ंक्शन होगा, जो पोस्ट-इंस्टॉल और setup.py केवल उचित समय पर आयात और लॉन्च करेगा।

setup.py :

from distutils.core import setup
from distutils.command.install_data import install_data

try:
    from post_setup import main as post_install
except ImportError:
    post_install = lambda: None

class my_install(install_data):
    def run(self):
        install_data.run(self)
        post_install()

if __name__ == '__main__':
    setup(
        ...
        cmdclass={'install_data': my_install},
        ...
    )

post_setup.py :

def main():
    """Do here your post-install"""
    pass

if __name__ == '__main__':
    main()

इसकी निर्देशिका से setup.py लॉन्च करने के सामान्य विचार के साथ, आप post_setup.py आयात करने में सक्षम post_setup.py अन्यथा यह एक खाली फ़ंक्शन लॉन्च करेगा।

post_setup.py , if __name__ == '__main__': कथन आपको कमांड लाइन से मैन्युअल रूप से पोस्ट-इंस्टॉल लॉन्च करने की अनुमति देता है।


यदि एटेक्सिट का उपयोग करते हैं, तो एक नया cmdclass बनाने की आवश्यकता नहीं है। आप सेटअप () कॉल से ठीक पहले अपना एटैक्सिट रजिस्टर बना सकते हैं। यह वही काम करता है।

इसके अलावा, यदि आपको पहले स्थापित होने के लिए निर्भरता की आवश्यकता है, तो यह पाइप इंस्टॉल के साथ काम नहीं करता है क्योंकि आपके एटैक्सिट हैंडलर को पाइप को जगह में ले जाने से पहले बुलाया जाएगा।


यह एकमात्र रणनीति है जो मेरे लिए काम करती है जब पोस्ट-इंस्टॉल स्क्रिप्ट की आवश्यकता होती है कि पैकेज निर्भरता पहले से ही स्थापित हो चुकी है:

import atexit
from setuptools.command.install import install


def _post_install():
    print('POST INSTALL')


class new_install(install):
    def __init__(self, *args, **kwargs):
        super(new_install, self).__init__(*args, **kwargs)
        atexit.register(_post_install)


setuptools.setup(
    cmdclass={'install': new_install},






pypi