दिलचस्प पोस्ट
आप टेक्स्टरिए में कर्सर की स्थिति कैसे प्राप्त करते हैं? मैं दृश्य स्टूडियो में एक DLL फ़ाइल के लिए पथ कैसे सेट करूं? अवैध क्लाइंट पक्ष JWT सत्र विभिन्न जेएस पुस्तकालयों द्वारा किए गए सभी AJAX अनुरोधों को कैसे रोकें dynamic_cast और static_cast सी ++ में कैसे कंसोल.इन (stdin) को पुनः निर्देशित कर दिया गया है? मापा संकेत का पीक पहचान $ .jax की सफलता और .done () विधि के बीच अंतर क्या है DLLs से ASP.NET MVC दृश्य लोड करने के लिए VirtualPathProvider का उपयोग करना पायथन के साथ एक UTF8 सीएसवी फ़ाइल पढ़ना कम के साथ चयनकर्ताओं की सूची बनाएं जावास्क्रिप्ट चर नामों के लिए कौन से पात्र मान्य हैं? पायथन: दो पूर्ण पथों की तुलना से संबंधित मार्ग प्राप्त करें प्रोसिबबिल्डर और रनटाइम। एक्सएसी () के बीच का अंतर गिनती के साथ लंबे प्रारूप में लंबे समय तक कन्वर्ट करने का आसान तरीका

कैसे ठीक से वर्तमान स्क्रिप्ट निर्देशिका का निर्धारण करने के लिए?

मुझे यह देखना है कि अजगर में मौजूदा स्क्रिप्ट निर्देशिका को निर्धारित करने का सबसे अच्छा तरीका क्या है?

मुझे पता चला कि अजगर कोड को बुलाए जाने के कई तरीके से दो, यह एक अच्छा समाधान ढूंढना कठिन है।

यहां कुछ समस्याएं हैं:

  • __file__ परिभाषित नहीं है अगर स्क्रिप्ट execfile , execfile साथ निष्पादित है
  • __module__ केवल मॉड्यूल में परिभाषित किया गया है

बक्सों का इस्तेमाल करें:

  • ./myfile.py
  • python myfile.py
  • ./somedir/myfile.py
  • python somedir/myfile.py
  • execfile('myfile.py') (एक अन्य स्क्रिप्ट से, जो कि किसी अन्य निर्देशिका में स्थित हो सकता है और उसमें एक अन्य वर्तमान निर्देशिका हो सकती है

मुझे पता है कि कोई सही समाधान नहीं है, क्योंकि कुछ मामलों में, लेकिन मैं सबसे अच्छा तरीका तलाश रहा हूं जो अधिकांश मामलों का हल करता है

सबसे अधिक उपयोग किया जाने वाला दृष्टिकोण os.path.dirname(os.path.abspath(__file__)) लेकिन यह वास्तव में काम नहीं करता है अगर आप exec() साथ किसी अन्य स्क्रिप्ट को निष्पादित करते हैं।

चेतावनी

मौजूदा डायरेक्टरी का उपयोग करने वाला कोई भी समाधान असफल हो जायेगा, यह स्क्रिप्ट के नाम के आधार पर भिन्न हो सकता है या इसे चल स्क्रिप्ट के अंदर बदला जा सकता है।

वेब के समाधान से एकत्रित समाधान "कैसे ठीक से वर्तमान स्क्रिप्ट निर्देशिका का निर्धारण करने के लिए?"

 os.path.dirname(os.path.abspath(__file__)) 

वास्तव में सबसे अच्छा है कि आप प्राप्त करने जा रहे हैं

exec / execfile साथ एक स्क्रिप्ट निष्पादित करना असामान्य है; आमतौर पर आपको स्क्रिप्ट लोड करने के लिए मॉड्यूल इंफ्रास्ट्रक्चर का इस्तेमाल करना चाहिए। यदि आपको इन विधियों का इस्तेमाल करना है, तो मैं आपको बताता हूं कि __file__ को __file__ में __file__ गए __file__ में सेट करें ताकि यह फ़ाइल नाम पढ़ सके।

Execed कोड में फ़ाइल नाम प्राप्त करने का कोई दूसरा तरीका नहीं है: जैसा कि आप ध्यान दें, CWD एक पूरी तरह से अलग जगह हो सकता है

यदि आप वास्तव में केस को कवर करना चाहते हैं कि स्क्रिप्ट को execfile(...) माध्यम से कहा जाता है, तो आप फ़ाइल का नाम (पथ सहित) का पता लगाने के लिए inspect मॉड्यूल inspect उपयोग कर सकते हैं। जहाँ तक मुझे पता है, यह आपके द्वारा सूचीबद्ध सभी मामलों के लिए काम करेगा:

 filename = inspect.getframeinfo(inspect.currentframe()).filename path = os.path.dirname(os.path.abspath(filename)) 
 #!/usr/bin/env python import inspect import os import sys def get_script_dir(follow_symlinks=True): if getattr(sys, 'frozen', False): # py2exe, PyInstaller, cx_Freeze path = os.path.abspath(sys.executable) else: path = inspect.getabsfile(get_script_dir) if follow_symlinks: path = os.path.realpath(path) return os.path.dirname(path) print(get_script_dir()) 

यह CPython, Jython, Pypy पर काम करता है यह काम करता है अगर स्क्रिप्ट execfile() ( execfile() sys.argv[0] और __file__ आधारित समाधान का उपयोग करके निष्पादित किया जाता है यहां विफल हो जाएगा)। यह काम करता है अगर स्क्रिप्ट निष्पादन योग्य ज़िप फ़ाइल (/ अंडा) के अंदर है यह काम करता है अगर स्क्रिप्ट "आयातित" है (ज़िप PYTHONPATH=/path/to/library.zip python -mscript_to_run पिन PYTHONPATH=/path/to/library.zip python -mscript_to_run ) ज़िप फ़ाइल से; यह इस मामले में संग्रह पथ देता है। यह काम करता है यदि स्क्रिप्ट एक स्टैंडअलोन एक्जीक्यूटेबल ( sys.frozen ) में संकलित हो जाती है। यह सिमुलेशन के लिए काम करता है ( realpath प्रतीकात्मक लिंक समाप्त करता है) यह एक इंटरैक्टिव दुभाषिया में काम करता है; यह वर्तमान कार्य निर्देशिका को इस मामले में देता है।

बस os.path.dirname(os.path.abspath(__file__)) उपयोग करें और बहुत सावधानी से जांच करें कि क्या इस मामले की वास्तविक आवश्यकता है जहां exec उपयोग किया जाता है। यदि आप अपनी स्क्रिप्ट को मॉड्यूल के रूप में उपयोग नहीं कर पा रहे हैं, तो यह परेशान डिजाइन का संकेत हो सकता है।

पायथन # 8 की ज़ेन को ध्यान में रखें, और अगर आपको लगता है कि उपयोग के मामले में कोई अच्छा तर्क है, जहां उसे exec लिए काम करना है, तो कृपया हमें समस्या की पृष्ठभूमि के बारे में कुछ और जानकारी दें।

यह अधिकांश मामलों में काम करना चाहिए:

 import os,sys dirname=os.path.dirname(os.path.realpath(sys.argv[0])) 

पायथन pathlib आप सरल pathlib मॉड्यूल का उपयोग कर सकते हैं:

 from inspect import currentframe, getframeinfo from pathlib import Path filename = getframeinfo(currentframe()).filename parent = Path(filename).resolve().parent 

सबसे पहले … एक युगल लापता उपयोग-मामलों यहाँ अगर हम अज्ञात कोड इंजेक्ट करने के तरीकों के बारे में बात कर रहे हैं ..

 code.compile_command() code.interact() imp.load_compiled() imp.load_dynamic() imp.load_module() __builtin__.compile() loading C compiled shared objects? example: _socket?) 

लेकिन, असली सवाल यह है, आपका लक्ष्य क्या है – क्या आप किसी प्रकार की सुरक्षा को लागू करने की कोशिश कर रहे हैं? या आप क्या लोड किया जा रहा में रुचि रखते हैं।

यदि आप सुरक्षा में रुचि रखते हैं, तो फ़ाइल नाम जिसे exec / execfile के माध्यम से आयात किया जा रहा है वह असंगत है – आपको rexec का उपयोग करना चाहिए, जो निम्न प्रदान करता है:

इस मॉड्यूल में RExec वर्ग है, जो r_eval (), r_execfile (), r_exec (), और r_import () विधियों का समर्थन करता है, जो कि मानक पायथन फ़ंक्शंस eval (), execfile () और exec और आयात स्टेटमेंट के प्रतिबंधित संस्करण हैं। इस प्रतिबंधित वातावरण में कार्यान्वित कोड केवल उन मॉड्यूलों और कार्यों तक पहुंच पाएंगे जो सुरक्षित समझाए जाते हैं; आप वांछित के रूप में RExec को जोड़ने या क्षमताओं को हटा सकते हैं।

हालांकि, अगर यह एक अकादमिक पीछा से अधिक है .. यहां कुछ भ्रष्ट दृष्टिकोण हैं जो आप में गहराई से गहराई तक जा सकते हैं ..

उदाहरण स्क्रिप्ट:

./deep.py

 print ' >> level 1' execfile('deeper.py') print ' << level 1' 

./deeper.py

 print '\t >> level 2' exec("import sys; sys.path.append('/tmp'); import deepest") print '\t << level 2' 

/tmp/deepest.py

 print '\t\t >> level 3' print '\t\t\t I can see the earths core.' print '\t\t << level 3' 

./codespy.py

 import sys, os def overseer(frame, event, arg): print "loaded(%s)" % os.path.abspath(frame.f_code.co_filename) sys.settrace(overseer) execfile("deep.py") sys.exit(0) 

उत्पादन

 loaded(/Users/synthesizerpatel/deep.py) >> level 1 loaded(/Users/synthesizerpatel/deeper.py) >> level 2 loaded(/Users/synthesizerpatel/<string>) loaded(/tmp/deepest.py) >> level 3 I can see the earths core. << level 3 << level 2 << level 1 

बेशक, यह यह करने के लिए एक संसाधन-गहन तरीका है, आप अपने सभी कोड का पता लगा सकते हैं .. बहुत ही कुशल नहीं है लेकिन, मुझे लगता है कि यह एक नया दृष्टिकोण है क्योंकि यह अभी भी काम करता है जब तक आप घोंसले में गहरा हो जाते हैं। आप 'eval' को ओवरराइड नहीं कर सकते यद्यपि आप execfile ओवरराइड कर सकते हैं ()

ध्यान दें, यह दृष्टिकोण केवल coveres exec / execfile, नहीं 'आयात' उच्च स्तर 'मॉड्यूल' लोड करने के लिए आप sys.path_hooks (लिखने के लिए PyMOTW के शिष्टाचार) का उपयोग करने में सक्षम हो सकते हैं।

सब कुछ मैं अपने सिर के ऊपर बंद कर दिया है।

यहां एक आंशिक समाधान है, अभी तक सभी प्रकाशित लोगों की तुलना में अभी भी बेहतर है।

 import sys, os, os.path, inspect #os.chdir("..") if '__file__' not in locals(): __file__ = inspect.getframeinfo(inspect.currentframe())[0] print os.path.dirname(os.path.abspath(__file__)) 

अब यह काम सभी कॉल करेगा, लेकिन यदि कोई वर्तमान निर्देशिका बदलने के लिए chdir() का उपयोग करता है, तो यह भी विफल हो जाएगा।

टिप्पणियाँ:

  • sys.argv[0] काम नहीं कर रहा है, यदि आप स्क्रिप्ट को python -c "execfile('path-tester.py')" साथ निष्पादित करते हैं, तो वापस आ जाएगी। python -c "execfile('path-tester.py')"
  • मैंने https://gist.github.com/1385555 पर एक पूरा परीक्षण प्रकाशित किया है और आप इसे सुधारने के लिए स्वागत है।

उम्मीद है कि यह मदद करता है: – यदि आप कहीं से एक स्क्रिप्ट / मॉड्यूल चलाते हैं तो आप __file__ चर का उपयोग कर __file__ जो एक स्क्रिप्ट के स्थान का प्रतिनिधित्व करने वाला एक मॉड्यूल चर है।

दूसरी तरफ, यदि आप दुभाषिया का प्रयोग कर रहे हैं तो आपको उस वैरिएबल तक पहुंच नहीं है, जहां आपको एक नाम मिलेगा, os.getcwd() और os.getcwd() आपको गलत निर्देशिका देगा यदि आप फ़ाइल से चल रहे हैं कहीं और।

इस समाधान से आपको सभी मामलों में जो चाहिए वह आपको देना चाहिए:

 from inspect import getsourcefile from os.path import abspath abspath(getsourcefile(lambda:0)) 

मैंने इसे पूरी तरह से परीक्षण नहीं किया है, लेकिन यह मेरी समस्या का हल निकाला है।

चाहेंगे

 import os cwd = os.getcwd() 

तुम्हें जो करना है करो? मुझे यकीन नहीं है कि "वर्तमान स्क्रिप्ट निर्देशिका" का मतलब क्या है। आपके द्वारा उपयोग किए गए मामलों के लिए अपेक्षित उत्पादन क्या होगा?