जवाबों:
आप __file__
वर्तमान फ़ाइल का नाम प्राप्त करने के लिए उपयोग कर सकते हैं । जब मुख्य मॉड्यूल में उपयोग किया जाता है, तो यह उस स्क्रिप्ट का नाम है जिसे मूल रूप से लागू किया गया था।
यदि आप निर्देशिका भाग को छोड़ना चाहते हैं (जो मौजूद हो सकता है), तो आप उपयोग कर सकते हैं os.path.basename(__file__)
।
__file__
इंटरैक्टिव दुभाषिया में परिभाषित नहीं है, क्योंकि यह वहां अर्थहीन है। यह आयात कार्यान्वयन द्वारा निर्धारित किया जाता है, इसलिए यदि आप एक गैर-मानक आयात तंत्र का उपयोग करते हैं तो यह भी परेशान हो सकता है।
import os
इसके लिए काम करना आवश्यक है। मैं इस जवाब में जोड़ देंगे।
import os
और import os.path
पूरी तरह से समकक्ष हैं।
import sys
print sys.argv[0]
यह प्रिंट होगा foo.py
के लिए python foo.py
, dir/foo.py
के लिए python dir/foo.py
आदि, यह करने के लिए पहला तर्क है python
। (ध्यान दें कि py2.exe के बाद यह होगा foo.exe
।)
python linkfile.py
, जहां linkfile.py
एक सिम्लिंक है realfile.py
, sys.argv[0]
वह होगा 'linkfile.py'
, जो आप चाहते हैं या नहीं हो सकता है; यह निश्चित रूप से मैं क्या उम्मीद है । __file__
वही है: यह होगा linkfile.py
। आप जानना चाहते हैं तो 'realfile.py'
से 'linkfile.py'
, कोशिश os.path.realpath('linkfile.py')
।
__file__
इसके बजाय का उपयोग करें ।
पूर्णता के लिए, मैंने सोचा कि यह विभिन्न संभावित परिणामों को संक्षेप में प्रस्तुत करना और प्रत्येक के सटीक व्यवहार के लिए संदर्भों की आपूर्ति करना सार्थक होगा:
__file__
वर्तमान में निष्पादित फ़ाइल है, जैसा कि आधिकारिक दस्तावेज में विस्तृत है :
__file__
उस फ़ाइल का पथनाम है जिसमें से मॉड्यूल लोड किया गया था, अगर वह फ़ाइल से लोड किया गया था।__file__
विशेषता जैसे मॉड्यूल, के कुछ प्रकार के लिए याद आ रही हो सकता है सी मॉड्यूल है कि स्थिर दुभाषिया में जुड़े होते हैं; साझा लाइब्रेरी से गतिशील रूप से लोड किए गए विस्तार मॉड्यूल के लिए, यह साझा लाइब्रेरी फ़ाइल का पथनाम है।
पाइथन 3.4 से, प्रति अंक 18416 से , __file__
हमेशा एक निरपेक्ष पथ होता है, जब तक कि वर्तमान में निष्पादित फ़ाइल एक स्क्रिप्ट है जिसे सीधे निष्पादित किया गया है ( -m
कमांड लाइन विकल्प के साथ दुभाषिया के माध्यम से नहीं ) एक रिश्तेदार पथ का उपयोग करके।
__main__.__file__
(आयात करने की आवश्यकता होती है __main__
) बस मुख्य मॉड्यूल के पूर्वोक्त __file__
विशेषता तक पहुँचता है , उदाहरण के लिए स्क्रिप्ट जो कमांड लाइन से लगाई गई थी।
sys.argv[0]
(आयात की आवश्यकता है sys
) स्क्रिप्ट नाम है जिसे कमांड लाइन से लागू किया गया था, और आधिकारिक दस्तावेज में विस्तृत रूप से एक पूर्ण मार्ग हो सकता है :
argv[0]
स्क्रिप्ट नाम है (यह ऑपरेटिंग सिस्टम निर्भर करता है कि यह एक पूर्ण पथनाम है या नहीं)। यदि कमांड-c
दुभाषिया के लिए कमांड लाइन विकल्प का उपयोग करके निष्पादित किया गया था ,argv[0]
तो स्ट्रिंग पर सेट किया गया है'-c'
। यदि पायथन इंटरप्रेटर के लिए कोई स्क्रिप्ट नाम नहीं दिया गया था,argv[0]
तो रिक्त स्ट्रिंग है।
के रूप में में उल्लेख किया है इस सवाल का एक और उत्तर , अजगर स्क्रिप्ट है कि इस तरह के रूप में उपकरण के माध्यम से स्टैंड-अलोन निष्पादन योग्य कार्यक्रमों में बदल दिया गया py2exe या PyInstaller वांछित परिणाम प्रदर्शित नहीं हो सकता है जब इस दृष्टिकोण का उपयोग कर (यानी sys.argv[0]
नाम के बजाय निष्पादन के नाम का आयोजन होगा उस निष्पादन योग्य के भीतर मुख्य पायथन फ़ाइल)।
यदि उपरोक्त विकल्पों में से कोई भी काम नहीं करता है, तो शायद अनियमित आयात ऑपरेशन के कारण, निरीक्षण मॉड्यूल उपयोगी साबित हो सकता है। विशेष रूप से, लागू inspect.getfile(...)
पर inspect.currentframe()
, काम कर सकता था हालांकि बाद होगा लौटनेNone
जब बिना एक कार्यान्वयन में चल अजगर ढेर फ्रेम।
यदि वर्तमान स्क्रिप्ट एक प्रतीकात्मक लिंक है, तो उपरोक्त सभी वास्तविक फ़ाइल के पथ के बजाय प्रतीकात्मक लिंक का मार्ग लौटाएंगे और os.path.realpath(...)
बाद में निकालने के लिए इसे लागू किया जाना चाहिए।
os.path.basename(...)
वास्तविक फ़ाइल नाम निकालने के लिए उपरोक्त में से किसी पर भी लागू किया जा सकता है और os.path.splitext(...)
इसके प्रत्यय को कम करने के लिए वास्तविक फ़ाइल नाम पर लागू किया जा सकता है, जैसे किos.path.splitext(os.path.basename(...))
।
से अजगर 3.4 के बाद से, प्रति पीईपी 428 , PurePath
वर्ग के pathlib
मॉड्यूल उपरोक्त में से किसी पर अच्छी तरह से रूप में इस्तेमाल किया जा सकता है। विशेष रूप से, pathlib.PurePath(...).name
वास्तविक फ़ाइल नाम को pathlib.PurePath(...).stem
निकालता है और वास्तविक फ़ाइल नाम को उसके प्रत्यय के बिना निकालता है।
ध्यान दें कि __file__
वह फाइल देगा जहां यह कोड रहता है, जिसे आयात किया जा सकता है और मुख्य फाइल से अलग किया जा सकता है। मुख्य फ़ाइल प्राप्त करने के लिए, विशेष __main__ मॉड्यूल का उपयोग किया जा सकता है:
import __main__ as main
print(main.__file__)
ध्यान दें कि __main__.__file__
पायथन 2.7 में काम करता है, लेकिन 3.2 में नहीं, इसलिए इसे पोर्टेबल बनाने के लिए आयात-ऊपर सिंटैक्स का उपयोग करें।
rPython
से पैकेज का उपयोग कर रहा हूं R
। यह एक असाधारण मामला होना चाहिए जिसे संभालना बहुत मुश्किल है।
__main__
आंतरिक रूप से आयात करता है , R
और इसके बीच चर चर में उपयोग के लिए python
, इसलिए इसे __main__.__file__
और कुछ भी कॉल करने से पहले सेट करना अपेक्षाकृत आसान होगा , लेकिन मुझे यह भी निश्चित नहीं है कि इस मामले में एक उचित मूल्य क्या होगा।
उपरोक्त उत्तर अच्छे हैं। लेकिन मैंने इस विधि को उपरोक्त परिणामों का उपयोग करके अधिक कुशल पाया।
यह वास्तविक स्क्रिप्ट फ़ाइल नाम के परिणामस्वरूप एक पथ नहीं है।
import sys
import os
file_name = os.path.basename(sys.argv[0])
आधुनिक पायथन संस्करणों (3.4+) के लिए, Path(__file__).name
अधिक मुहावरेदार होना चाहिए। इसके अलावा, Path(__file__).stem
आप .py
विस्तार के बिना स्क्रिप्ट नाम देता है ।
from pathlib import Path
पहले होना चाहिए ।
pathlib
को Python 3.4 में पेश किया गया था, इसलिए इसे Python 3.4 से शुरू करना चाहिए।
यह मानते हुए कि फ़ाइल नाम foo.py
नीचे का स्निपेट है
import sys
print sys.argv[0][:-3]
या
import sys
print sys.argv[0][::-1][3:][::-1]
अधिक पात्रों के साथ अन्य सीमाओं के लिए, उदाहरण के लिए फ़ाइल नाम foo.pypy
import sys
print sys.argv[0].split('.')[0]
अगर तुम एक निरपेक्ष मार्ग से निकलना चाहते हो
import sys
print sys.argv[0].split('/')[-1].split('.')[0]
उत्पादन होगा foo
Sys में पहला तर्क वर्तमान फ़ाइल नाम होगा इसलिए यह काम करेगा
import sys
print sys.argv[0] # will print the file name
यदि आप एक असामान्य आयात कर रहे हैं (उदाहरण के लिए, यह एक विकल्प फ़ाइल है), कोशिश करें:
import inspect
print (inspect.getfile(inspect.currentframe()))
ध्यान दें कि यह फ़ाइल में पूर्ण पथ लौटाएगा।
हम बिना विस्तार के वर्तमान स्क्रिप्ट नाम प्राप्त करने के लिए यह कोशिश कर सकते हैं।
import os
script_name = os.path.splitext(os.path.basename(__file__))[0]
os.path.abspath(__file__)
आपको एक पूर्ण मार्ग देगा ( relpath()
उपलब्ध भी)।
sys.argv[-1]
आप एक रिश्तेदार रास्ता दे देंगे।
यह सभी उत्तर महान हैं, लेकिन कुछ समस्याएं हैं जिन्हें आप पहली नज़र में नहीं देख सकते हैं।
हम जो चाहते हैं उसे परिभाषित करते हैं - हम उस स्क्रिप्ट का नाम चाहते हैं जिसे निष्पादित किया गया था, वर्तमान मॉड्यूल का नाम नहीं है - इसलिए __file__
केवल तभी काम करेगा जब इसे निष्पादित स्क्रिप्ट में उपयोग किया जाता है, न कि किसी आयातित मॉड्यूल में।
sys.argv
यह भी संदिग्ध है - क्या होगा यदि आपका कार्यक्रम पाइस्टेस्ट द्वारा बुलाया गया था? या pydoc धावक? या अगर यह uwsgi द्वारा बुलाया गया था?
और - स्क्रिप्ट नाम प्राप्त करने की एक तीसरी विधि है, मैंने उत्तर में देखा है - आप स्टैक का निरीक्षण कर सकते हैं।
एक और समस्या यह है, कि आप (या कुछ अन्य कार्यक्रम) के साथ छेड़छाड़ कर सकते हैं sys.argv
और __main__.__file__
- यह मौजूद हो सकता है, यह नहीं हो सकता है। यह मान्य हो सकता है, या नहीं। यदि स्क्रिप्ट (वांछित परिणाम) मौजूद है तो कम से कम आप देख सकते हैं!
मेरी लाइब्रेरी बिट्रॉक्स / lib_programname github पर ठीक यही करती है:
__main__
मौजूद है तो जाँच करें__main__.__file__
मौजूद है तो जाँच करें__main__.__file__
एक वैध परिणाम (है कि स्क्रिप्ट मौजूद है?)इस तरह से, मेरे समाधान अब तक के साथ काम कर रहा है setup.py test
, uwsgi
, pytest
, pycharm pytest
, pycharm docrunner (doctest)
, dreampie
,eclipse
Dough Hellman की उस समस्या के बारे में एक अच्छा ब्लॉग लेख भी है, "पायथन से एक प्रक्रिया का नाम निर्धारित करना"
अजगर 3.5 के रूप में आप बस कर सकते हैं:
from pathlib import Path
Path(__file__).stem
यहाँ और देखें: https://docs.python.org/3.5/library/pathlib.html#pathlib.PurePath.stem
उदाहरण के लिए, मेरे पास test.py
इसके अंदर नामित मेरी उपयोगकर्ता निर्देशिका के तहत एक फ़ाइल है:
from pathlib import Path
print(Path(__file__).stem)
print(__file__)
इस आउटपुट को चलाना:
>>> python3.6 test.py
test
test.py
Exception NameError: NameError("global name '__file__' is not defined",)
"