2012-04-24 10 views
8

यदि आप किसी निर्देशिका से एक जमे हुए पायथन स्क्रिप्ट (py2exe का उपयोग करके जमे हुए) चला रहे हैं और स्क्रिप्ट मौजूद है, तो अलग से ड्राइव ड्राइव, पथ का निर्धारण करने का सबसे अच्छा तरीका क्या है निष्पादन स्क्रिप्ट?निष्पादन जमे हुए स्क्रिप्ट का पथ कैसे प्राप्त करें

कुछ समाधान मैं कोशिश की है

inspect.getfile(inspect.currentframe()) 

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

os.path.abspath(__file__) 

समस्या: विंडोज

पर
os.path.dirname(sys.argv[0]) 

समस्या काम नहीं करता: खाली स्ट्रिंग देता है।

os.path.abspath(inspect.getsourcefile(way3)) 

अगर ड्राइव pwd से अलग है काम नहीं करेंगे

os.path.dirname(os.path.realpath(sys.argv[0])) 
अगर ड्राइव pwd

यहाँ से अलग है

काम नहीं करेंगे एक न्यूनतम नहीं है - उदाहरण उदाहरण

D:\>path 
PATH=c:\Python27\;c:\Users\abhibhat\Desktop\ToBeRemoved\spam\dist\;c:\gnuwin32\bin 

D:\>cat c:\Users\abhibhat\Desktop\ToBeRemoved\spam\eggs.py 
import os, inspect, sys 
def way1(): 
    return os.path.dirname(sys.argv[0]) 

def way2(): 
    return inspect.getfile(inspect.currentframe()) 

def way3(): 
    return os.path.dirname(os.path.realpath(sys.argv[0])) 

def way4(): 
    try: 
     return os.path.abspath(__file__) 
    except NameError: 
     return "Not Found" 
def way5(): 
    return os.path.abspath(inspect.getsourcefile(way3)) 

if __name__ == '__main__': 
    print "Path to this script is",way1() 
    print "Path to this script is",way2() 
    print "Path to this script is",way3() 
    print "Path to this script is",way4() 
    print "Path to this script is",way5() 

D:\>eggs 
Path to this script is 
Path to this script is eggs.py 
Path to this script is D:\ 
Path to this script is Not Found 

संबंधित प्रश्न:

नोट

@ Fenikso समाधान करता है, तो स्क्रिप्ट पर रहता है काम करेंगे एक ही ड्राइव तुम कहाँ क्रियान्वित कर रहे हैं, लेकिन जब अपनी एक अलग ड्राइव पर, यह काम नहीं करेगा

उत्तर

10

एक और दृष्टिकोण जब एक और ड्राइव से चल भी पथ का उपयोग कर जो cxFreeze साथ काम करता है:

import sys 

if hasattr(sys, 'frozen'): 
    print(sys.executable) 
else: 
    print(sys.argv[0]) 

अजगर से:

H:\Python\Examples\cxfreeze\pwdme.py 

कमांड लाइन से:

D:\>h:\Python\Examples\cxfreeze\dist\pwdme.exe 
h:\Python\Examples\cxfreeze\dist\pwdme.exe 

पथ का उपयोग:

D:\>pwdme.exe 
h:\Python\Examples\cxfreeze\dist\pwdme.exe 
+2

हां, यह py2exe के साथ भी काम करता है। –

+0

@ फेनिक्सो: यह पूरी तरह से काम करता है। इस प्रश्न को पोस्ट करने से पहले मैंने एसओ में एक ही समस्या के कुछ संदर्भ देखे हैं, लेकिन कोई जवाब सही नहीं है '। – Abhijit

0

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

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

है यही कारण है कि मैं cx_Freeze के साथ उपयोग जहां .exe है से प्राप्त करने के लिए निर्देशिका वास्तव में चल रहा है।

+0

यह अगर स्क्रिप्ट एक अलग ड्राइव – Abhijit

+0

@Abhijit में मौजूद है काम नहीं करेगा - क्षमा करें, मुझे समझ नहीं आता। यह मेरी सभी जमे हुए स्क्रिप्ट का मौलिक हिस्सा है और यह कभी विफल नहीं हुआ। क्या आप विफल होने पर एक उदाहरण का वर्णन कर सकते हैं? – Fenikso

+0

मैंने इस परिदृश्य को शामिल करने के लिए उदाहरण अपडेट किया है। यदि ड्राइव अलग है, तो यह उस ड्राइव का नाम देता है जहां से आप चल रहे हैं। – Abhijit

2

आईएमएचओ, कोड जो पूर्ण पथों के आधार पर अलग-अलग कार्य करता है वह एक अच्छा समाधान नहीं है। यह शायद एक सापेक्ष पथ समाधान बेहतर होगा। क्रॉस प्लेटफार्म संगतता के लिए सापेक्ष निर्देशिका और os.sep जानने के लिए dirname का उपयोग करें।

if hasattr(sys, "frozen"): 
    main_dir = os.path.dirname(sys.executable) 
    full_real_path = os.path.realpath(sys.executable) 
else: 
    script_dir = os.path.dirname(__file__) 
    main_dir = os.path.dirname(os.path.realpath(sys.argv[0])) 
    full_real_path = os.path.realpath(sys.argv[0]) 

जमे हुए विशेषता पायथन मानक है।

Esky पर भी एक नज़र डालें: http://pypi.python.org/pypi/esky

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