2008-11-13 11 views
6

मेरे पास पाइथन स्क्रिप्ट्स की एक उचित संख्या है जिसमें पुन: प्रयोज्य कोड शामिल है जिसका उपयोग अन्य पायथन स्क्रिप्ट द्वारा किया जाता है और संदर्भित किया जाता है। हालांकि, ये स्क्रिप्ट अलग-अलग निर्देशिकाओं में बिखरी हुई हैं और मुझे लगता है कि यह मेरी शीर्ष-स्तरीय स्क्रिप्ट पर sys.path.append को (अक्सर अक्सर एकाधिक) कॉल करने के लिए कुछ हद तक कठिन होता है। मैं सिर्फ उसी स्क्रिप्ट में अतिरिक्त फ़ाइल संदर्भों के बिना 'आयात' कथन प्रदान करना चाहता हूं।पायथन में, मैं स्क्रिप्ट फ़ाइलों के बीच संदर्भों को कुशलता से प्रबंधित कैसे कर सकता हूं?

वर्तमान में, मैं इस है:

import sys 
sys.path.append('..//shared1//reusable_foo') 
import Foo 
sys.path.append('..//shared2//reusable_bar') 
import Bar 

मेरी प्राथमिकता होगी निम्नलिखित:

import Foo 
import Bar 

मेरी पृष्ठभूमि नेट मंच में मुख्य रूप से है तो मैं इस तरह के रूप मेटा फ़ाइलें होने के आदी हूं * .csproj, * .vbproj, * .sln, आदि स्रोत फ़ाइलों के बाहर वास्तविक फ़ाइल पथ संदर्भों को प्रबंधित और रखने के लिए। यह मुझे सभी संदर्भों को उजागर किए बिना 'पथ' निर्देशों (पायथन के आयात के बराबर) प्रदान करने की अनुमति देता है और पथ स्क्रिप्ट को कई स्क्रिप्ट में पुन: उपयोग करने की इजाजत देता है।

क्या पाइथन के लिए इसके बराबर समर्थन है और यदि नहीं, तो कुछ तकनीकें और दृष्टिकोण क्या हैं?

उत्तर

4

सरल उत्तर अपनी साइट-संकुल निर्देशिका, जो आपके सिस में है में अपने पुन: प्रयोज्य कोड डालने के लिए है। पथ।

आप अपने पथ में कहीं भी .pth फ़ाइलों को जोड़कर खोज पथ का विस्तार भी कर सकते हैं। अधिक जानकारी के

ओह, और अजगर के लिए https://docs.python.org/2/install/#modifying-python-s-search-path देखें 2.6/3.0 PEP370 लिए समर्थन जोड़ता है, Per-user site-packages Directory

3

अपने पुन: प्रयोज्य फ़ाइलें पैक कर रहे हैं, तो (अर्थात, वे एक __init__.py फ़ाइल को शामिल) और कहा कि पैकेज के लिए पथ अपने PYTHONPATH या sys.path का हिस्सा है तो आप सिर्फ

import Foo 

ऐसा करने में सक्षम होना चाहिए This question कुछ और विवरण प्रदान करता है।

(नोट: के रूप में जिम ने कहा, आप भी अपने पुन: प्रयोज्य कोड अपने site-packages निर्देशिका में छोड़ सकता है।)

1

आप site-packages में पुन: प्रयोज्य सामान रख सकते हैं। यह पूरी तरह से पारदर्शी है, क्योंकि यह डिफ़ॉल्ट रूप से sys.path में है।

आप फ़ाइलों को site-packages में डाल सकते हैं। इन फ़ाइलों में निर्देशिका है जिसमें आपकी वास्तविक पुन: प्रयोज्य सामग्री रहती है। यह भी पूरी तरह से पारदर्शी है। और site-packages में परिवर्तन स्थापित करने के अतिरिक्त चरण को शामिल नहीं करता है।

आप PYTHONPATH पर पुन: प्रयोज्य सामान की निर्देशिका डाल सकते हैं। यह थोड़ा कम पारदर्शी है, क्योंकि आपको यह सुनिश्चित करना है कि यह सेट है। रॉकेट विज्ञान नहीं, लेकिन पूरी तरह पारदर्शी नहीं है।

1

एक प्रोजेक्ट में, मैं यह सुनिश्चित करना चाहता था कि उपयोगकर्ता पाइथन स्क्रिप्ट्स (जो मूल रूप से प्लगइन के रूप में उपयोग किया जा सकता है) डाल सकता है। मेरे समाधान है कि परियोजना के लिए कॉन्फ़िग फ़ाइल में निम्नलिखित डाल करने के लिए किया गया था:

[server] 
PYPATH_APPEND: /home/jason:/usr/share/some_directory 

इस तरह, इस कार्यक्रम के शुभारंभ पर अजगर पथ पर जोड़ने/घर/जेसन और/usr/share/some_directory होगा।

फिर, यह कॉलन द्वारा स्ट्रिंग को विभाजित करने और sys.path के अंत में उन निर्देशिकाओं को जोड़ने का एक साधारण मामला है। आप साइट-पैकेज निर्देशिका में एक मॉड्यूल डालने पर विचार करना चाह सकते हैं जिसमें उस कॉन्फ़िगरेशन फ़ाइल में पढ़ने के लिए कोई फ़ंक्शन शामिल है और उन निर्देशिकाओं को sys.path में जोड़ें (दुर्भाग्यवश, मेरे पास एक उदाहरण लिखने के लिए समय नहीं है) ।

जैसा कि अन्य ने उल्लेख किया है, साइट-पैकेज जितना संभव हो उतना और पीपी फाइलों का उपयोग करना एक अच्छा विचार है। लेकिन यह एक अच्छा विचार हो सकता है यदि आपके पास ऐसी स्क्रिप्ट है जिसे सामानों का एक समूह आयात करने की आवश्यकता है जो साइट-पैकेज में नहीं है जिसे आप अन्य स्क्रिप्ट से आयात नहीं करना चाहते हैं।

(वहाँ भी फ़ाइलें .pth का उपयोग कर यह करने के लिए एक तरीका हो सकता है, लेकिन मैं एक ही स्थान पर अजगर पथ में हेरफेर करने में सक्षम होने के रूप में मैं अपने विन्यास जानकारी के बाकी डाल की तरह) सबसे आसान तरीका

1

PYTHONPATH को सेट (या जोड़ना) है, और अपने मॉड्यूल और पैकेज को PYTHONPATH में निहित पथ में डाल दें (या सिमलिंक करें)।

0

मेरे समाधान एक उपयोगिता है कि मॉड्यूल आयात होता पैकेज के लिए गया था: my_util साइट संकुल में है

import my_util 

foo = myutil.import_script('..//shared1//reusable_foo') 
if foo == None: 
    sys.exit(1) 


def import_script(script_path, log_status = True): 
    """ 
    imports a module and returns the handle 
    """ 
    lpath = os.path.split(script_path) 

    if lpath[1] == '': 
     log('Error in script "%s" in import_script' % (script_path)) 
     return None 


    #check if path is already in sys.path so we don't repeat 
    npath = None 
    if lpath[0] == '': 
     npath = '.' 
    else: 
     if lpath[0] not in sys.path: 
      npath = lpath[0] 

    if npath != None: 
     try: 
      sys.path.append(npath) 
     except: 
      if log_status == True: 
       log('Error adding path "%s" in import_script' % npath) 
      return None 

    try: 
     mod = __import__(lpath[1]) 
    except: 
     error_trace,error_reason = FormatExceptionInfo() 
     if log_status == True: 
      log('Error importing "%s" module in import_script: %s' % (script_path, error_trace + error_reason)) 
     sys.path.remove(npath) 
     return None 

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

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