पायथन एक lib के रूप में एक फ़ाइल नाम

मेरे पास निम्न स्क्रिप्ट है

import getopt, sys
opts, args = getopt.getopt(sys.argv[1:], "h:s")
for key,value in opts:
    print key, "=>", value

अगर मैं इस getopt.py को नाम देता हूं और चलाता हूं तो यह काम नहीं करता है क्योंकि यह स्वयं आयात करने का प्रयास करता है

क्या इसके चारों ओर एक रास्ता है, इसलिए मैं इस फ़ाइल नाम को रख सकता हूं लेकिन आयात पर निर्दिष्ट करता हूं कि मैं मानक पायथन lib चाहता हूं और यह फ़ाइल नहीं?

विंको के उत्तर के आधार पर समाधान:

import sys
sys.path.reverse()
from getopt import getopt

opts, args = getopt(sys.argv[1:], "h:s")

for key,value in opts:
    print key, "=>", value
2

5 उत्तर

आपको मौजूदा स्क्रिप्ट जैसे अपनी स्क्रिप्ट का नाम नहीं देना चाहिए। विशेष रूप से मानक अगर।

उस ने कहा, आप लाइब्रेरी लोडिंग ऑर्डर को संशोधित करने के लिए sys.path को स्पर्श कर सकते हैं

~# cat getopt.py
print "HI"
~# python
Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> import getopt
HI

~# python
Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.remove('')
>>> import getopt
>>> dir(getopt)
['GetoptError', '__all__', '__builtins__', '__doc__', '__file__', '__name__', 'do_longs', 'do_shorts', 'error', 'getopt', 'gnu_getopt', 'long_has_args', 'os', 'short_has_arg']

इसके अतिरिक्त, आप पूर्ण आयात से बचने और इसे अलग-अलग करने की इच्छा कर सकते हैं, इस तरह:

import sys
sys.path.remove('')
from getopt import getopt
sys.path.insert(0,'')
opts, args = getopt(sys.argv[1:], "h:s")
for key,value in opts:
    print key, "=>", value
7
जोड़ा
मैंने sys.path.reverse() का उपयोग किया क्योंकि मुझे लगता है कि यह बेहतर है और इसे हटा रहा है क्योंकि शायद किसी को एक और lib आयात करने की आवश्यकता है जो वास्तव में वर्तमान फ़ोल्डर में है, मेरे प्रश्न को अपडेट करने के साथ आपके समाधान को अपडेट करेगा जो यह आपकी सलाहओं के आधार पर पाया गया है लेकिन यह बुरा है मेरी राय। libs जैसे स्क्रिप्ट नाम नहीं करने के लिए बहुत बेहतर है
जोड़ा लेखक daniels, स्रोत
@ डैनियल: यहां देखें python.org/dev/peps/pep-0328
जोड़ा लेखक André, स्रोत

आपको मानक लाइब्रेरी मॉड्यूल नामों के साथ अपनी पायथन फ़ाइलों का नामकरण करने से बचना चाहिए।

4
जोड़ा
दुर्भाग्यवश, इस सलाह का पालन करना मुश्किल है क्योंकि नए मानक लाइब्रेरी नाम प्रकट होते हैं ... मुझे "ईमेल" मॉड्यूल द्वारा एक बार और "यूयूआईडी" मॉड्यूल द्वारा दूसरी बार काटा गया था :-(
जोड़ा लेखक bortzmeyer, स्रोत
जब मैं कुछ करता हूं तो विकास करता हूं, लेकिन यह सिर्फ जिज्ञासा है। किसी फोरम पर किसी को यह समस्या थी और अगर इसके आसपास कोई रास्ता है तो मैं curios था
जोड़ा लेखक daniels, स्रोत
@ Daniels: वहाँ है - अद्वितीय नामों का उपयोग करें।
जोड़ा लेखक S.Lott, स्रोत
--- अपने ऐप को एक नए मानक पुस्तकालय संस्करण में अपग्रेड करने की लागत ---
जोड़ा लेखक gimel, स्रोत
import getopt as bettername

इससे आपको गेटोपेट को bettername के रूप में कॉल करने की अनुमति मिलनी चाहिए।

1
जोड़ा
यह अभी भी खुद को आयात करता है (getopt.py) और लाइब्रेरी नहीं
जोड़ा लेखक daniels, स्रोत

पाइथन आपको मॉड्यूल अर्हता प्राप्त करने का कोई तरीका नहीं देता है। आप sys.path से प्रविष्टि को हटाकर या इसे अंत तक ले जाकर इसे पूरा करने में सक्षम हो सकते हैं। मैं इसकी सिफारिश नहीं करता।

0
जोड़ा

खैर, आप sys.path से वर्तमान diretory को स्थानांतरित कर सकते हैं, जिसमें पुस्तकालयों के लिए इसे संशोधित करने के लिए संशोधित खोज पथ शामिल है, अगर आपको वास्तव में इसकी आवश्यकता है।

0
जोड़ा