अपडेट 2018-11-28:
यहाँ पायथन 2 और 3. के साथ प्रयोगों का सारांश दिया गया है
main.py - foo.py foo.py चलाता है
- lib / bar.py
lib / bar.py - prints filepath अभिव्यक्त करता है
| Python | Run statement | Filepath expression |
|--------+---------------------+----------------------------------------|
| 2 | execfile | os.path.abspath(inspect.stack()[0][1]) |
| 2 | from lib import bar | __file__ |
| 3 | exec | (wasn't able to obtain it) |
| 3 | import lib.bar | __file__ |
पायथन 2 के लिए, पैकेजों पर स्विच करने के लिए यह स्पष्ट हो सकता है ताकि उपयोग कर सकें from lib import bar
- बस __init__.py
दो फ़ोल्डरों में खाली फाइलें जोड़ें ।
पायथन 3 के लिए, execfile
मौजूद नहीं है - निकटतम विकल्प है exec(open(<filename>).read())
, हालांकि यह स्टैक फ्रेम को प्रभावित करता है। यह सिर्फ उपयोग करने के लिए सबसे सरल है import foo
और import lib.bar
- कोई __init__.py
फ़ाइलों की आवश्यकता नहीं है।
आयात और निष्पादन के बीच अंतर भी देखें
मूल उत्तर:
इस धागे में उत्तरों पर आधारित एक प्रयोग है - विंडोज पर पायथन 2.7.10 के साथ।
स्टैक-आधारित केवल वही हैं जो विश्वसनीय परिणाम देते हैं। अंतिम दो में सबसे छोटा वाक्यविन्यास है , -
print os.path.abspath(inspect.stack()[0][1]) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\filepaths\lib
यहाँ इन कार्यों के रूप में sys में जोड़ा जा रहा है! इसका श्रेय @Usagi और @pablog को दिया जाएगा
निम्न तीन फ़ाइलों के आधार पर, और अपने फोल्डर से मेनफ्रेम चला रहा है python main.py
(निरपेक्ष रास्तों के साथ निष्पादन की कोशिश करता है और एक अलग फ़ोल्डर से कॉल करता है)।
C: \ filepaths \ main.py: execfile('foo.py')
C: \ filepaths \ foo.py: execfile('lib/bar.py')
C: \ filepaths \ lib \ bar.py:
import sys
import os
import inspect
print "Python " + sys.version
print
print __file__ # main.py
print sys.argv[0] # main.py
print inspect.stack()[0][1] # lib/bar.py
print sys.path[0] # C:\filepaths
print
print os.path.realpath(__file__) # C:\filepaths\main.py
print os.path.abspath(__file__) # C:\filepaths\main.py
print os.path.basename(__file__) # main.py
print os.path.basename(os.path.realpath(sys.argv[0])) # main.py
print
print sys.path[0] # C:\filepaths
print os.path.abspath(os.path.split(sys.argv[0])[0]) # C:\filepaths
print os.path.dirname(os.path.abspath(__file__)) # C:\filepaths
print os.path.dirname(os.path.realpath(sys.argv[0])) # C:\filepaths
print os.path.dirname(__file__) # (empty string)
print
print inspect.getfile(inspect.currentframe()) # lib/bar.py
print os.path.abspath(inspect.getfile(inspect.currentframe())) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # C:\filepaths\lib
print
print os.path.abspath(inspect.stack()[0][1]) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\filepaths\lib
print
__file__
विशेषता निरपेक्ष या रिश्तेदार?