पायथन मॉड्यूल / पैकेज कैसे लिखें?


375

मैं काम पर सरल कार्यों के लिए पायथन स्क्रिप्ट बना रहा हूं और कभी भी दूसरों के उपयोग के लिए उन्हें पैकेजिंग से परेशान नहीं किया है। अब मुझे REST API के लिए पायथन रैपर बनाने का काम सौंपा गया है। मुझे पता नहीं है कि कैसे शुरू करें और मुझे मदद की ज़रूरत है।

जो मेरे पास है:

(बस संभव के रूप में विशिष्ट होना चाहते हैं) मेरे पास virtualenv तैयार है, यह github में भी है , अजगर के लिए .itignignore फ़ाइल वहाँ है, साथ ही, प्लस, REST API के साथ बातचीत करने के लिए अनुरोध पुस्तकालय । बस।

यहां वर्तमान निर्देशिका पेड़ है

.
├── bin
   └── /the usual stuff/
├── include
   └── /the usual stuff/
├── lib
   └── python2.7
       └── /the usual stuff/
├── local
   └── /the usual stuff/
└── README.md

27 directories, 280 files

मैं यह भी नहीं जानता कि अगर मैं कभी एक बनाऊं तो .py फाइलें कहां रखूं।

मैं क्या करना चाहता था:

एक अजगर मॉड्यूल स्थापित करें "पाइप स्थापित करें ..." के साथ सक्षम

यदि संभव हो तो, मैं पायथन मॉड्यूल लिखने पर कदम प्रक्रिया द्वारा एक सामान्य कदम चाहता हूं।


15
मैं ट्यूटोरियल (2.7) के अध्याय 6 से शुरू करूंगा , या यहां 3.x के लिए अजगर मॉड्यूल ट्यूटोरियल के लिए इंटरनेट पर खोज करूंगा और आपको बहुत सारे मिल जाएंगे।
रोलैंड स्मिथ

6
किसी ने पाइप भाग का जवाब नहीं दिया
whackamadoodle3000

github.com/MacHu-GWU/pygitrepo-project यह लाइब्रेरी आपको स्क्रैच से प्रोजेक्ट कंकाल बनाने में मदद करती है, और आपको जो सुविधा चाहिए वह बॉक्स से बाहर है।
MacSanhe

जवाबों:


424

एक मॉड्यूल एक फाइल है जिसमें पायथन परिभाषाएँ और कथन हैं। फ़ाइल नाम प्रत्यय के साथ मॉड्यूल नाम है.py

बनाने hello.pyतो इसकी सामग्री के रूप में निम्नलिखित समारोह लिखें:

def helloworld():
   print "hello"

फिर आप आयात कर सकते हैं hello:

>>> import hello
>>> hello.helloworld()
'hello'
>>>

कई .pyफ़ाइलों को समूहित करने के लिए उन्हें एक फ़ोल्डर में रखें। __init__.pyअजगर के साथ किसी भी फ़ोल्डर को एक मॉड्यूल माना जाता है और आप उन्हें पैकेज कह सकते हैं

|-HelloModule
  |_ __init__.py
  |_ hellomodule.py

आप सामान्य तरीके से अपने मॉड्यूल पर आयात विवरण के साथ जा सकते हैं।

अधिक जानकारी के लिए, 6.4 देखें संकुल


7
कि पिछले एक हो सकता है: HellowModule से hellomodule आयात करें? क्या यह मॉड्यूल फ़ोल्डर में हैलो हो सकता है, इसलिए यह HelloModule आयात हैलो से होगा
nycynik

वर्तमान में पायथन के साथ खेल रहा है और यह उत्तर मुझे सबसे ज्यादा मददगार है। बहुत अच्छी तरह से समझाता है, धन्यवाद।
डेरेन वेनराईट

"पाइप इंस्टॉल" कमांड काम नहीं करेगा, इसका उपयोग करने के लिए भी आपको उसी निर्देशिका में रहना होगा
गणित कोडर 101

234

पायथन 3 - 18 नवंबर 2015 को अद्यतन किया गया

स्वीकृत उत्तर को उपयोगी पाया, फिर भी अपने अनुभवों के आधार पर दूसरों के लाभ के लिए कई बिंदुओं पर विस्तार करना चाहा।

मॉड्यूल: एक मॉड्यूल पायथन परिभाषाओं और बयानों से युक्त एक फ़ाइल है। फ़ाइल नाम प्रत्यय के साथ मॉड्यूल का नाम है।

मॉड्यूल उदाहरण : मान लें कि हमारे पास वर्तमान निर्देशिका में एक एकल अजगर स्क्रिप्ट है, यहां मैं इसे mymodule.py कह रहा हूं

फ़ाइल mymodule.py में निम्नलिखित कोड है:

def myfunc():
    print("Hello!")

यदि हम मौजूदा निर्देशिका से python3 दुभाषिया चलाते हैं, तो हम निम्नलिखित विभिन्न तरीकों से फ़ंक्शन myfunc को आयात और चला सकते हैं (आप आमतौर पर निम्नलिखित में से एक का चयन करेंगे):

>>> import mymodule
>>> mymodule.myfunc()
Hello!
>>> from mymodule import myfunc
>>> myfunc()
Hello!
>>> from mymodule import *
>>> myfunc()
Hello!

ठीक है, इतना आसान था।

अब मान लें कि आपको इस मॉड्यूल को अपने स्वयं के समर्पित फ़ोल्डर में डालने के लिए एक मॉड्यूल नेमस्पेस प्रदान करने की आवश्यकता है, बजाय इसके कि यह वर्तमान कार्यशील निर्देशिका से तदर्थ चलाए। यह वह जगह है जहां यह पैकेज की अवधारणा को समझाने के लायक है ।

पैकेज : पैकेज "डॉटेड मॉड्यूल नाम" का उपयोग करके पायथन के मॉड्यूल नामस्थान को संरचित करने का एक तरीका है। उदाहरण के लिए, मॉड्यूल नाम AB, A नाम के पैकेज में B नाम का एक सबमॉड्यूल डिजाइन करता है। जैसे मॉड्यूल का उपयोग विभिन्न मॉड्यूल के लेखकों को एक दूसरे के वैश्विक चर नामों के बारे में चिंता करने से बचाता है, बिंदीदार मॉड्यूल नामों का उपयोग लेखकों को बचाता है। मल्टी-मॉड्यूल पैकेज जैसे न्यूपी या पायथन इमेजिंग लाइब्रेरी को एक-दूसरे के मॉड्यूल नामों के बारे में चिंता करने से।

पैकेज उदाहरण : अब मान लेते हैं कि हमारे पास निम्नलिखित फ़ोल्डर और फाइलें हैं। यहाँ, mymodule.py पहले जैसा है, और __init__.py एक खाली फ़ाइल है:

.
└── mypackage
    ├── __init__.py
    └── mymodule.py

__Init__.py फ़ाइलों को पैकेज युक्त निर्देशिकाओं का इलाज करने के लिए पायथन की आवश्यकता होती है। अधिक जानकारी के लिए, कृपया बाद में प्रदान किए गए मॉड्यूल प्रलेखन लिंक देखें।

हमारी वर्तमान कार्यशील निर्देशिका साधारण फ़ोल्डर के ऊपर एक स्तर है जिसे mypackage कहा जाता है

$ ls
mypackage

यदि हम अभी python3 इंटरप्रेटर चलाते हैं, तो हम निम्नलिखित विभिन्न तरीकों से आवश्यक फ़ंक्शन myfunc वाले मॉड्यूल mymodule.py को आयात और चला सकते हैं (आप आमतौर पर निम्नलिखित में से एक का चयन करेंगे):

>>> import mypackage
>>> from mypackage import mymodule
>>> mymodule.myfunc()
Hello!
>>> import mypackage.mymodule
>>> mypackage.mymodule.myfunc()
Hello!
>>> from mypackage import mymodule
>>> mymodule.myfunc()
Hello!
>>> from mypackage.mymodule import myfunc
>>> myfunc()
Hello!
>>> from mypackage.mymodule import *
>>> myfunc()
Hello!

पायथन 3 को मानते हुए, इसमें उत्कृष्ट प्रलेखन है: मॉड्यूल

संकुल और मॉड्यूल के लिए नामकरण सम्मेलनों के संदर्भ में, सामान्य दिशानिर्देश PEP-0008 में दिए गए हैं - कृपया पैकेज और मॉड्यूल नाम देखें

मॉड्यूल में छोटे, सभी-लोअरकेस नाम होने चाहिए। यदि यह पठनीयता में सुधार करता है तो अंडरस्कोर मॉड्यूल के नाम में उपयोग किया जा सकता है। पायथन पैकेज में भी छोटे, सभी-लोअरकेस नाम होने चाहिए, हालांकि अंडरस्कोर का उपयोग हतोत्साहित किया जाता है।


5
अच्छी सरल व्याख्या। यदि आप mypackage के अंदर एक और फ़ोल्डर रखना चाहते हैं तो क्या होगा?
अनुज गुप्ता

3
पूरी तरह से शामिल है जो आपने लिखा था पर निर्भर करता है। यदि आप अपने मॉड्यूल पर किसी फ़ंक्शन के बाहर सामान रखते हैं, तो आप इसे कॉल करते समय आग लगा देंगे import mypackage। मामले में आप एक मॉड्यूल से एक फ़ंक्शन आयात करना चाहते हैं (यहां तक ​​कि एक फ़ाइल) का उपयोग करना बेहतर है from module import function। मामले में एक सबफ़ोल्डर from subfolder.module import functionतो आप बस function()witthout आग अन्य कोड भागों कॉल कर सकते हैं । इसके अलावा, from module import *अगर आपको वास्तव में ज़रूरत नहीं है तो इसका उपयोग न करें ।
m3nda

5
एकमात्र सवाल यह है कि मुझे सब कुछ आयात करने के लिए पैकेज कैसे मिल सकता है import mypackage? जोड़ने import mymoduleसे __init__.pyकाम नहीं चलता ..
576i

नीट स्पष्टीकरण! हालाँकि, मेरे पास एक सवाल है कि अगर खसखस ​​एक पैकेज है तो मैं अपने दुभाषिया में numpy.cos (1) को कैसे निष्पादित कर सकता हूं क्योंकि यह गुम होने के बीच एक मॉड्यूल नाम लगता है। नहीं?
user1935724

3
पाइप के बारे में कैसे?
whackamadoodle3000

199

चूंकि किसी ने भी ओपी के इस सवाल को कवर नहीं किया है:

मैं क्या करना चाहता था:

एक अजगर मॉड्यूल स्थापित करें "पाइप स्थापित करें ..." के साथ सक्षम

यहां एक पूर्ण न्यूनतम उदाहरण है, अपने पैकेज को तैयार करने setuptoolsऔर उपयोग करने के लिए PyPI का उपयोग करने और अपलोड करने के मूल चरणों को दर्शाता हैtwine

यह कम से कम ट्यूटोरियल पढ़ने के लिए कोई विकल्प नहीं है , इस बहुत ही मूल उदाहरण में इसे कवर करने की तुलना में बहुत अधिक है।

पैकेज का निर्माण करना पहले से ही यहां अन्य उत्तरों द्वारा कवर किया गया है, तो चलिए मान लेते हैं कि हमारे पास वह कदम है और हमारी परियोजना संरचना इस तरह है:

.
└── hellostackoverflow/
    ├── __init__.py
    └── hellostackoverflow.py

setuptoolsपैकेजिंग के लिए उपयोग करने के लिए, हमें एक फ़ाइल जोड़ने की आवश्यकता है setup.py, यह हमारी परियोजना के मूल फ़ोल्डर में जाती है:

.
├── setup.py
└── hellostackoverflow/
    ├── __init__.py
    └── hellostackoverflow.py

न्यूनतम पर, हम अपने पैकेज के लिए मेटाडेटा निर्दिष्ट करते हैं, हमारा काम setup.pyइस तरह दिखेगा:

from setuptools import setup

setup(
    name='hellostackoverflow',
    version='0.0.1',
    description='a pip-installable package example',
    license='MIT',
    packages=['hellostackoverflow'],
    author='Benjamin Gerfelder',
    author_email='benjamin.gerfelder@gmail.com',
    keywords=['example'],
    url='https://github.com/bgse/hellostackoverflow'
)

जब से हमने सेट किया है license='MIT', हम अपनी परियोजना में एक प्रतिलिपि शामिल करते हैं LICENCE.txt, जैसे reStructuredText में एक रीडमी फ़ाइल के साथ README.rst:

.
├── LICENCE.txt
├── README.rst
├── setup.py
└── hellostackoverflow/
    ├── __init__.py
    └── hellostackoverflow.py

इस बिंदु पर, हम पैकेजिंग का उपयोग करने के लिए जाने के लिए तैयार हैं setuptools, अगर हमारे पास यह पहले से स्थापित नहीं है, तो हम इसे स्थापित कर सकते हैं pip:

pip install setuptools

ऐसा करने के लिए और source distributionहमारे प्रोजेक्ट रूट फ़ोल्डर में हम setup.pyकमांड लाइन से अपने कॉल को निर्दिष्ट करते हैं, जो हम चाहते हैं sdist:

python setup.py sdist

यह हमारे वितरण पैकेज और अंडा-जानकारी का निर्माण करेगा, और इस तरह से हमारे पैकेज के साथ एक फ़ोल्डर संरचना में परिणाम होगा dist:

.
├── dist/
├── hellostackoverflow.egg-info/
├── LICENCE.txt
├── README.rst
├── setup.py
└── hellostackoverflow/
    ├── __init__.py
    └── hellostackoverflow.py

इस बिंदु पर, हमारे पास एक पैकेज है जिसे हम उपयोग कर सकते हैं pip, इसलिए हमारी परियोजना रूट से (यह मानते हुए कि आपके पास सभी नामकरण इस उदाहरण में हैं:

pip install ./dist/hellostackoverflow-0.0.1.tar.gz

अगर सब ठीक हो जाता है, तो हम अब पायथन इंटरप्रेटर खोल सकते हैं, मैं किसी भी भ्रम से बचने के लिए हमारी परियोजना निर्देशिका के बाहर कहीं कहूंगा, और हमारे चमकदार नए पैकेज का उपयोग करने का प्रयास करूंगा:

Python 3.5.2 (default, Sep 14 2017, 22:51:06) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from hellostackoverflow import hellostackoverflow
>>> hellostackoverflow.greeting()
'Hello Stack Overflow!'

अब जब हमने पैकेज इंस्टॉल और कार्यों की पुष्टि कर दी है, तो हम इसे PyPI पर अपलोड कर सकते हैं।

चूंकि हम अपने प्रयोगों के साथ लाइव रिपॉजिटरी को प्रदूषित नहीं करना चाहते हैं, हम परीक्षण रिपॉजिटरी के लिए एक खाता बनाते हैं , और twineअपलोड प्रक्रिया के लिए स्थापित करते हैं:

pip install twine

अब हम लगभग वहाँ हैं, हमारे द्वारा बनाए गए खाते के साथ हम केवल twineअपना पैकेज अपलोड करने के लिए कहते हैं, यह हमारे क्रेडेंशियल्स के लिए पूछेगा और हमारे पैकेज को निर्दिष्ट रिपॉजिटरी में अपलोड करेगा:

twine upload --repository-url https://test.pypi.org/legacy/ dist/*

हम अब PyPI टेस्ट रिपॉजिटरी पर अपने खाते में लॉग इन कर सकते हैं और अपने नए अपलोड किए गए पैकेज पर थोड़ी देर के लिए चमत्कार कर सकते हैं, और फिर इसका उपयोग करके इसे पकड़ सकते हैं pip:

pip install --index-url https://test.pypi.org/simple/ hellostackoverflow

जैसा कि हम देख सकते हैं, मूल प्रक्रिया बहुत जटिल नहीं है। जैसा कि मैंने पहले कहा था, यहाँ इसे कवर करने की तुलना में बहुत अधिक है, इसलिए आगे बढ़ें और अधिक गहन विवरण के लिए ट्यूटोरियल पढ़ें


क्या मेरा पैकेज सही प्रकाशित किया जाएगा setuptools?
U10- फॉरवर्ड

@ U9- फ़ॉरवर्ड नहीं, प्रकाशन के साथ किया जाता है twine, लेकिन आपके द्वारा बनाए जाने के बाद आप प्रकाशन से पहले अपने पैकेज का परीक्षण कर सकते हैं setuptools
bgse

9

एक बार जब आप अपने चुने हुए आदेशों को परिभाषित कर लेते हैं, तो आप बस अपने अजगर प्रोग्राम फ़ाइलों में सहेजे गए फ़ाइल को लिबर फ़ोल्डर में खींच सकते हैं और छोड़ सकते हैं।

>>> import mymodule 
>>> mymodule.myfunc()

2

"Hello.py" नाम की एक फ़ाइल बनाएं

यदि आप पायथन 2.x का उपयोग कर रहे हैं

def func():
    print "Hello"

यदि आप पायथन 3.x का उपयोग कर रहे हैं

def func():
    print("Hello")

फ़ाइल चलाएँ। फिर, आप निम्नलिखित प्रयास कर सकते हैं:

>>> import hello
>>> hello.func()
Hello

यदि आप थोड़ा कठिन चाहते हैं, तो आप निम्नलिखित का उपयोग कर सकते हैं:

यदि आप पायथन 2.x का उपयोग कर रहे हैं

def say(text):
    print text

यदि आप पायथन 3.x का उपयोग कर रहे हैं

def say(text):
    print(text)

परिभाषित के बगल में कोष्ठक पर एक देखें? यह महत्वपूर्ण है। यह एक है जिसे आप परिभाषित के भीतर उपयोग कर सकते हैं।

पाठ - आप इसका उपयोग तब कर सकते हैं जब आप कार्यक्रम को यह कहना चाहते हैं कि आप क्या चाहते हैं। अपने नाम के अनुसार, यह पाठ है। मुझे आशा है कि आपको पता है कि पाठ का क्या अर्थ है। इसका अर्थ है "शब्द" या "वाक्य"।

फ़ाइल चलाएँ। यदि आप पायथन 3.x का उपयोग कर रहे हैं तो, आप निम्नलिखित कोशिश कर सकते हैं:

>>> import hello
>>> hello.say("hi")
hi
>>> from hello import say
>>> say("test")
test

पायथन 2.x के लिए - मैं पायथन 3 के साथ एक ही बात का अनुमान लगाता हूं? कोई जानकारी नहीं। मुझे सही करें अगर मैंने पायथन 2.x पर एक गलती की है (मैं पायथन 2 को जानता हूं लेकिन मुझे पायथन 3 के साथ प्रयोग किया जाता है)


2

मैं आसानी से खरोंच से एक परियोजना कंकाल आरंभ करने के लिए एक परियोजना बनाईhttps://github.com/MacHu-GWU/pygitrepo-project

और तुम, एक परीक्षण परियोजना, आइए कहते हैं बना सकते हैं learn_creating_py_package

आप सीख सकते हैं कि अलग-अलग उद्देश्य के लिए आपके पास क्या घटक होना चाहिए :

  • virtualenv बनाएँ
  • खुद को स्थापित करें
  • एकतरफा दौड़ना
  • कोड कवरेज चलाएं
  • दस्तावेज़ बनाएँ
  • दस्तावेज़ को तैनात करें
  • विभिन्न अजगर संस्करण में एकतरफा दौड़ें
  • PYPI पर तैनात

उपयोग करने का लाभ pygitrepoयह है कि उन लोगों के थकाऊ स्वचालित रूप से अपने ही बनाया है और अनुकूलन कर रहे हैं package_name, project_name, github_account, document host service, windows or macos or linux

यह एक समर्थक की तरह अजगर परियोजना विकसित करने के लिए एक अच्छी जगह है।

आशा है कि यह मदद कर सकता है।

धन्यवाद।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.