2013-01-24 15 views
11

मेरे पास एक प्रोजेक्ट में कुछ कोड है जिसे मैं किसी अन्य प्रोजेक्ट में पुन: उपयोग करना चाहता हूं। मुझे क्या करने की ज़रूरत है (दोनों फ़ोल्डरों में) ताकि मैं यह कर सकूं?पायथन में अन्य परियोजनाओं से कार्यों को कैसे आयात करें?

निर्देशिका संरचना है कुछ की तरह:

  • फू
    • Project1
      • file1.py
      • file2.py
  • बार
    • Project2
      • fileX.py
      • fileY.py

मैं fileX.py और fileY.py में file1.py और file2.py से कार्यों का उपयोग करना चाहते हैं ।

उत्तर

18

आदर्श रूप से दोनों परियोजनाएं एक स्थापित करने योग्य पायथन पैकेज होगी, जो __init__.py और setup.py से भर जाएगी। फिर उन्हें python setup.py install या इसी तरह के साथ स्थापित किया जा सकता था।

यदि यह संभव नहीं है, तो execfile() का उपयोग करें! Foo जोड़ने के लिए PYTHONPATH का उपयोग करें ताकि import Project1.file1 काम कर सके।

उदाहरण के लिए

, Project2/fileX.py से:

from os import path 
import sys 
sys.path.append(path.abspath('../Foo')) 

from Project1.file1 import something 

हालांकि, असली जवाब प्रत्येक एक असतत स्थापना योग्य पैकेज बनाना है।

+0

प्रोजेक्ट 1 और प्रोजेक्ट 2 दोनों मेरे सर्वर पर बैठे दोनों संस्करणों के साथ नियंत्रित हैं। यदि प्रोजेक्ट 1 अपडेट किया गया है, तो मुझे प्रोजेक्ट 2 पर हर बार स्थापित पैकेज अपडेट करना होगा। लेकिन, अगर मैं अपने sys.path में हेरफेर करता हूं, तो प्रोजेक्ट 1 पर एक गिट खींचने से मेरा मॉड्यूल अपडेट हो जाएगा। क्या मैं कुछ सुगंधित कर रहा हूँ? या यह ठीक है! धन्यवाद! – Abhishek

5

आप इसे module से बाहर करना चाहते हैं और उसके बाद जो कुछ भी आपको चाहिए उसे आयात करें।

0

मैं तुम्हें os.path.join() या os.path.append() का उपयोग कर मौजूदा अजगर रास्ते पर Foo जोड़ सकते हैं और from import Project1.file1 import function_name कर सकते हैं लगता है।

+1

प्रोजेक्ट 1 में परिवर्तन इस तरह के मामले में प्रोजेक्ट 2 को क्रूर रूप से तोड़ने के लिए प्रवृत्त होंगे। अच्छा विचार नहीं। यह एक मॉड्यूल में बनाया जाना है, और संस्करण जारी किया है। –

+1

यह समस्या के शाब्दिक समाधान की तरह है। आपके द्वारा सुझाए गए एक सहित, इसे करने के अन्य (बेहतर) तरीके हो सकते हैं। –

0

आप वह कोड लेते हैं जिसे आप दोनों परियोजनाओं में उपयोग करना चाहते हैं, और आप इसे module में डाल देते हैं, जिसे आप तीसरे अलग प्रोजेक्ट में निकालते हैं। वह प्रोजेक्ट जो आप पैकेज में करते हैं, जिसे आप अलग से काम कर सकते हैं। फिर आप इसका संस्करण जारी करते हैं, और उन्हें अपनी अन्य परियोजनाओं में पुन: उपयोग करते हैं।

यह महत्वपूर्ण है कि आपके पास ऐसे संस्करण हैं जिन्हें आप "रिलीज़" करते हैं ताकि आप प्रत्येक प्रोजेक्ट का उपयोग करने वाले मॉड्यूल के किस संस्करण का ट्रैक रख सकें। अन्यथा आप ऐसी परिस्थिति में समाप्त हो जाएंगे जहां एक पुरानी परियोजना काम करना बंद कर दे क्योंकि आपने सामान्य मॉड्यूल में असंगत परिवर्तन किए हैं।

यदि यह सामान्य रूप से केवल आपके लिए ही नहीं बल्कि दूसरों के लिए उपयोग करने योग्य है, तो इसे PyPI पर अपलोड करने पर विचार करें।

5

यहां बहुत कुछ चल रहा है। आपको पाइथन पैकेज और मॉड्यूल प्रबंधन http://docs.python.org/2/tutorial/modules.html#packages के बारे में पढ़ना चाहिए, लेकिन मूल विचार यह है कि फ़ाइलएक्स को यह जानने की आवश्यकता है कि फ़ाइल 1 और फ़ाइल 2 उनका उपयोग करने के लिए कहां हैं।

फ़ोल्डर को किसी पैकेज में बदलने के लिए, इसमें केवल __init__.py फ़ाइल शामिल होना आवश्यक है। क्या मैं तुम क्या सुझाव है (एक टर्मिनल में)

$ touch Foo/__init__.py 
$ touch Foo/Project1/__init__.py 

(आप यूनिक्स/लिनक्स का उपयोग कर रहे कल्पना करते हुए) है।

फिर किसी भी तरह, फ़ाइलएक्स को यह जानने की जरूरत है कि Foo पैकेज कहां है। आप sys.path.append(PATH) पर कॉल कर सकते हैं जहां PATH Foo का स्थान है।

अंततः fileX के अंदर।py आप

import sys 
sys.path.append(PATH) #replace PATH with the path to Foo 

from Foo.Project1 import file1 

#use its functions 
file1.function_name(argument) 

होगा यदि आप वास्तव में सिर्फ पूर्ववर्ती बिना function_name कहना file1. आप from Foo.Project1.file1 import * कह कर अपने कार्यों के सभी आयात कर सकते हैं चाहता हूँ लेकिन कृपया ध्यान दें कि from module import *अत्यधिक के रूप में यह घुलमिल पर सिकोड़ी है नाम और कोड कम पठनीय और समझने योग्य

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