2010-11-11 6 views
209

के साथ वर्तमान स्क्रिप्ट का नाम प्राप्त करें मैं वर्तमान में चल रहे पाइथन स्क्रिप्ट का नाम प्राप्त करने का प्रयास कर रहा हूं।पाइथन

उदाहरण के लिए, मैं एक स्क्रिप्ट foo.py कहा जाता है और मैं इसके अंदर कुछ इस तरह करना चाहते हैं:

print Scriptname 

और मिलती है: foo.py

उत्तर

327

__file__ का उपयोग करें। यदि आप निर्देशिका भाग को छोड़ना चाहते हैं (जो मौजूद हो सकता है), तो आप os.path.basename(__file__) का उपयोग कर सकते हैं।

+9

अजगर 3.2 के साथ मेरे लिए काम किया: "' अपवाद NameError: NameError ("वैश्विक नाम '__FILE__' परिभाषित नहीं है",) ' – sdaau

+6

@sdaau:' __file__' को इंटरैक्टिव दुभाषिया में परिभाषित नहीं किया गया है, क्योंकि यह वहां व्यर्थ है। यह आयात कार्यान्वयन द्वारा निर्धारित किया जाता है, इसलिए यदि आप गैर-मानक आयात तंत्र का उपयोग करते हैं तो यह भी सेट नहीं हो सकता है। –

+1

कम से कम पायथन 2.7 के लिए, मेरा मानना ​​है कि काम करने के लिए 'आयात ओएस' की आवश्यकता है। मैं इसे जवाब में जोड़ दूंगा। –

86
import sys 
print sys.argv[0] 

यह python dir/foo.py के लिए python foo.py के लिए foo.py, dir/foo.py प्रिंट होगा, आदि यह python को पहला तर्क है। (। ध्यान दें कि py2exe के बाद यह foo.exe होगा)

+0

यह सिम्लिंक के लिए काम नहीं करेगा। –

+27

@ डेनिस मालिनोव्स्की: परिभाषित करें "काम नहीं करेगा"। यदि आप 'python linkfile.py' कहते हैं, जहां 'linkfile.py'' realfile.py' के लिए एक सिम्लिंक है,' sys.argv [0] '' linkfile.py 'होगा, जो हो सकता है या नहीं भी हो सकता है आपको क्या चाहिए; यह निश्चित रूप से मैं * की उम्मीद * है। '__file__' वही है: यह' linkfile.py' होगा। अगर आप ''linkfile.py' से 'realfile.py' ढूंढना चाहते हैं, तो 'os.path.realpath (' linkfile.py ')' आज़माएं। –

+6

+1 क्योंकि यह (ए) थोड़ा neater है और (बी) अभी भी मॉड्यूल में काम करेगा (जहां __file__ चर मॉड्यूल फ़ाइल होगी, निष्पादित नहीं होगा)। – robert

6

इस प्रयास करें:

print __file__ 
41

ध्यान दें कि __file__ फ़ाइल जहां इस कोड को रहता है, जिसे आयात और मुख्य फ़ाइल में व्याख्या की जा रही से अलग किया जा सकता है दे देंगे। मुख्य फ़ाइल पाने के लिए, विशेष __main__ मॉड्यूल का इस्तेमाल किया जा सकता है:

import __main__ as main 
print(main.__file__) 

ध्यान दें कि __main__.__file__ अजगर 2.7 में लेकिन 3.2 में नहीं काम करता है, तो के रूप में ऊपर आयात के रूप में उपयोग वाक्य रचना यह पोर्टेबल बनाने के लिए।

+0

लिख सकते हैं यह कई मामलों में काम करता है लेकिन जब मैं 'आर' भाषा से 'rPython' पैकेज का उपयोग नहीं कर रहा हूं। यह एक असाधारण मामला होना चाहिए जो संभालना बहुत मुश्किल है। – Leonid

+0

वास्तव में, आरपीथन पैकेज पाइथन दुभाषिया को एम्बेड करता है, जिसका अर्थ है कि वहां कोई 'मुख्य' फ़ाइल नहीं है जैसे कि पाइथन अपने आप चल रहा है (जब भी पाइथन एम्बेडेड होता है तो आपको वही व्यवहार मिल जाएगा)। यह 'R' और' पायथन 'के बीच गुजरने वाले चरों में उपयोग के लिए आंतरिक रूप से '__main__' आयात करता है, इसलिए किसी और को कॉल करने से पहले इसे' __main __.__ file__' सेट करना अपेक्षाकृत आसान होगा, लेकिन मुझे यह भी सुनिश्चित नहीं है कि क्या इस मामले में एक उचित मूल्य होगा। – Perkins

29

उपरोक्त उत्तरों अच्छे हैं। लेकिन मैंने उपरोक्त परिणामों का उपयोग करके इस विधि को और अधिक कुशल पाया।
इसके परिणामस्वरूप वास्तविक स्क्रिप्ट फ़ाइल नाम पथ नहीं है।

import sys  
import os  
file_name = os.path.basename(sys.argv[0]) 
+0

हां, यह मेरे लिए साफ दिखता है। धन्यवाद। – dentex

24

पूर्णता 'के लिए, मैंने सोचा कि यह सार्थक विभिन्न संभावित परिणामों का सारांश और प्रत्येक की सही व्यवहार के लिए संदर्भ की आपूर्ति होगा:

  • __file__ वर्तमान में क्रियान्वित फ़ाइल है, के रूप में में विस्तृत official documentation:

    __file__ is the pathname of the file from which the module was loaded, if it was loaded from a file. The __file__ attribute may be missing for certain types of modules, such as C modules that are statically linked into the interpreter; for extension modules loaded dynamically from a shared library, it is the pathname of the shared library file.

    बाद From Python3.4, issue 18416 प्रति, __file__ हमेशा एक पूर्ण पथ है, जब तक कि वर्तमान में निष्पादित फ़ाइल एक स्क्रिप्ट नहीं है जिसे एक सापेक्ष पथ का उपयोग करके सीधे निष्पादित किया गया है (-m कमांड लाइन विकल्प के साथ दुभाषिया के माध्यम से नहीं)।

  • __main__.__file__ (__main__ आयात करने की आवश्यकता है) बस main module के ऊपर उल्लिखित __file__ विशेषता है, उदा तक पहुँचता है कमांड लाइन से बुलाया गया स्क्रिप्ट का।

    argv[0] is the script name (it is operating system dependent whether this is a full pathname or not). If the command was executed using the -c command line option to the interpreter, argv[0] is set to the string '-c' . If no script name was passed to the Python interpreter, argv[0] is the empty string.

    another answer to this question में उल्लेख किया है, अजगर के रूप official documentation में विस्तृत

  • sys.argv[0] (की आवश्यकता है sys आयात करने), स्क्रिप्ट नाम है कि कमांड लाइन से लागू किया गया था है, और एक निरपेक्ष पथ हो सकता है स्क्रिप्ट्स जो py2exe या PyInstaller जैसे उपकरणों के माध्यम से स्टैंड-अलोन निष्पादन योग्य प्रोग्राम में परिवर्तित की गई थीं, इस दृष्टिकोण का उपयोग करते समय वांछित परिणाम प्रदर्शित नहीं कर सकती हैं (यानी sys.argv[0] नाम के बजाए निष्पादन योग्य का नाम रखेगी मुख्य पाइथन फ़ाइल निष्पादन योग्य के भीतर)।


os.path.basename() आदेश वास्तविक फ़ाइल नाम निकालने के लिए में उपरोक्त में से किसी पर लागू किया जा सकता है।

4

sys में पहला तर्क वर्तमान फ़ाइल नाम तो यह

import sys 
    print sys.argv[0] # will print the file name 
2

यह मानते हुए कि फ़ाइल नाम foo.py है काम करेंगे हो जाएगा, नीचे झलकी

import sys 
print sys.argv[0][:-3] 

या

import sys 
print sys.argv[0][::-1][3:][::-1] 

आउटपुट foo

+1

sys.argv [0] [: - 3] –

+0

@konpsych करेगा जो अधिक सुरुचिपूर्ण – xtonousou

+0

'__file__' और' sys.argv [0] 'के बीच बड़ा अंतर है, https://stackoverflow.com/questions/5851588 देखें/अंतर-बीच-फ़ाइल-और-sys-argv0 –

-1

मेरे तेजी से गंदा समाधान:

__file__.split('/')[-1:][0] 
+0

फ़ाइल नामों को विभाजित करने के लिए बेहतर 'os.path' का उपयोग करें –

0

यह अजगर 3,6

import inspect, os 
print (inspect.getfile(inspect.currentframe()))