2009-03-03 15 views
46

मान लीजिए मैं दो मॉड्यूल है:पायथन में __main__ मॉड्यूल के फ़ाइल नाम कैसे प्राप्त करें?

a.py:

import b 
print __name__, __file__ 

b.py:

print __name__, __file__ 

मैं "a.py" फ़ाइल चलाते हैं। यह प्रिंट:

b  C:\path\to\code\b.py 
__main__ C:\path\to\code\a.py 

प्रश्न: मैं "b.py" पुस्तकालय के भीतर से __main__ मॉड्यूल ("a.py" इस मामले में) के लिए पथ कैसे प्राप्त करते हैं?

उत्तर

58
import __main__ 
print __main__.__file__ 
+1

साफ! यह समझने के लिए महत्वपूर्ण है कि किसी को __main__ आयात करने की आवश्यकता है - मैंने एक यादृच्छिक अनुमान लगाया और वास्तव में दूसरी पंक्ति की कोशिश की, लेकिन यह असफल रहा - अब मुझे पता है क्यों। –

+17

'__main__' में हमेशा' __file__' विशेषता नहीं होती है। – jfs

+0

हाँ, अच्छा होगा अगर उत्तर का उल्लेख करने के लिए अद्यतन किया जा सके। –

27

शायद यह चाल करना होगा:

import sys 
from os import path 
print path.abspath(sys.modules['__main__'].__file__) 

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

python 
>>> import sys 
>>> print sys.modules['__main__'] 
<module '__main__' (built-in)> 
>>> print sys.modules['__main__'].__file__ 
AttributeError: 'module' object has no attribute '__file__' 

एक साधारण hasattr() चेक परिदृश्य 2 से सुरक्षा के लिए चाल करना होगा: यदि यह डायनामिक रूप से तैयार है, या बस इंटरैक्टिव अजगर कंसोल में चलाया जा रहा है, यह नहीं होगा एक __file__ आपके ऐप में

+0

यह करता है - धन्यवाद! –

+0

वंडरबार! मैं खुश हूं कि मैं मदद कर सका। यदि यह आपके प्रश्न का उत्तर देता है, तो क्या आप इस सवाल पर 'स्वीकार' बटन पर ध्यान देंगे? :-) –

+0

यदि आप इसे "आयात __main__" शैली का उपयोग करने के लिए संपादित करते हैं, तो मैं वापस स्वीकार कर दूंगा, क्योंकि यह नए स्वीकृत उत्तर से अधिक विस्तृत है। –

14

अजगर कोड के नीचे शामिल है कि वह py2exe निष्पादनयोग्य के साथ सहजता से काम करता है, अतिरिक्त सुविधा प्रदान करता है।

मैं चल रहे स्क्रिप्ट, उर्फ ​​__main__ से संबंधित पथ खोजने के लिए इस तरह के समान कोड का उपयोग करता हूं। एक अतिरिक्त लाभ के रूप में, यह विंडोज सहित क्रॉस-प्लेटफॉर्म का काम करता है।

import imp 
import os 
import sys 

def main_is_frozen(): 
    return (hasattr(sys, "frozen") or # new py2exe 
      hasattr(sys, "importers") # old py2exe 
      or imp.is_frozen("__main__")) # tools/freeze 

def get_main_dir(): 
    if main_is_frozen(): 
     # print 'Running from path', os.path.dirname(sys.executable) 
     return os.path.dirname(sys.executable) 
    return os.path.dirname(sys.argv[0]) 

# find path to where we are running 
path_to_script=get_main_dir() 

# OPTIONAL: 
# add the sibling 'lib' dir to our module search path 
lib_path = os.path.join(get_main_dir(), os.path.pardir, 'lib') 
sys.path.insert(0, lib_path) 

# OPTIONAL: 
# use info to find relative data files in 'data' subdir 
datafile1 = os.path.join(get_main_dir(), 'data', 'file1') 

उम्मीद है कि ऊपर के उदाहरण कोड कैसे चालू स्क्रिप्ट के पथ का निर्धारण करने के बारे में अतिरिक्त जानकारी प्रदान कर सकते हैं ...

+1

का उपयोग कर सकते हैं यदि आप लॉन्च करने के बीच निर्देशिका ('os.chdir' के साथ) बदलते हैं स्क्रिप्ट और कॉलिंग 'os.dirname (sys.argv [0])' परिणाम व्यर्थ है। – RobM

+0

मैं 'GLOBALS.py' मॉड्यूल बनाने के लिए उपयोग करता हूं, जिसे कम से कम मुख्य स्क्रिप्ट द्वारा आयात किया जाता है, जो उपरोक्त कोड की तरह कुछ निष्पादित करता है और परिणाम को एक परिवर्तनीय' MAINDIR' में संग्रहीत करता है, इसलिए मैं 'ग्लोबल्स.माइंडर' तक पहुंच सकता हूं। किसी अन्य मॉड्यूल से, 'os.chdir' के उपयोग की चिंता किए बिना। – Remi

+0

यदि आप अपनी स्क्रिप्ट की शुरुआती निर्देशिका जानना चाहते हैं और आप 'os.chdir()' का उपयोग करना चाहते हैं, तो आप प्रारंभिक 'os.getcwd()' को सहेजना चाहते हैं। चूंकि उपयोगकर्ता विंडोज़ पर था, इसलिए मैं ऐसा कुछ दिखाना चाहता था जो अभी भी py2exe के संदर्भ में काम करेगा और फ्रीज करेगा। – popcnt

1
import sys, os 

def getExecPath(): 
    try: 
     sFile = os.path.abspath(sys.modules['__main__'].__file__) 
    except: 
     sFile = sys.executable 
    return os.path.dirname(sFile) 

इस समारोह अजगर और Cython संकलित कार्यक्रमों के लिए काम करेंगे।

6

sys.argv[0] का उपयोग करने के लिए एक और तरीका होगा।

import os 
import sys 

main_file = os.path.realpath(sys.argv[0]) if sys.argv[0] else None 

sys.argv[0] कोई रिक्त स्ट्रिंग यदि अजगर -c के साथ शुरू या अजगर कंसोल से जाँच की है, तो हो जाता है हो जाएगा।

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