2010-02-18 22 views
15

मैं एक पार मंच तरीका है, जहां वास्तव में यह से चलाया जा रहा है में मेरी स्क्रिप्ट में कोड के इस बिट का उपयोग इंगित करने के लिए,:मैं निष्पादन योग्य की वर्तमान निर्देशिका py2exe में कैसे प्राप्त कर सकता हूं?

SCRIPT_ROOT = os.path.dirname(os.path.realpath(__file__)) 

सुंदर सरल। मैं यह सुनिश्चित करने के लिए कि सब कुछ ठीक से सापेक्ष है, मैं अपनी स्क्रिप्ट के अन्य क्षेत्रों में SCRIPT_ROOT का उपयोग करने के लिए आगे बढ़ता हूं। मेरी समस्या तब होती है जब मैं इसे py2exe के माध्यम से चलाता हूं, क्योंकि उत्पन्न निष्पादन योग्य __file__ सेट नहीं करता है, इसलिए मेरी स्क्रिप्ट टूट जाती है। क्या किसी को पता है कि इस के आसपास कैसे ठीक या काम करना है?

+0

एक पुराना डुप्लिकेट प्रश्न है लेकिन कम उत्तरों के साथ: [pyInstaller द्वारा उत्पन्न पायथन EXE में अनुप्रयोग पथ निर्धारित करना] (http://stackoverflow.com/questions/404744) – olibre

उत्तर

2

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

import os 
import sys 
os.path.realpath(os.path.dirname(sys.argv[0])) 
+1

मेरे अनुभव में, 'sys.argv [ 0] जब प्रोग्राम PATH चर के माध्यम से मिलता है तो इसका कोई पथ नहीं होता है। – Ber

+0

@ बियर, ... हालांकि, 'py2exe' एक विशेष मामला है, और यह सभी मामलों में पूरी तरह से योग्य मूल्य निर्धारित करता है। –

20

यहाँ py2exe documentation reference है और यहाँ हैं प्रासंगिक आइटम:

  • sys.executable exe ​​फ़ाइल का पूरा पथ नाम को तैयार है।
  • sys.argv में पहला आइटम निष्पादन योग्य का पूरा पथनाम है, बाकी कमांड लाइन तर्क हैं।
  • sys.frozen केवल निष्पादन योग्य में मौजूद है। यह एक कंसोल निष्पादन योग्य के लिए "console_exe" पर सेट है, कंसोल-कम gui निष्पादन योग्य के लिए "windows_exe" और एक inprocess dll सर्वर के लिए "dll" पर सेट है।
  • __file__ परिभाषित नहीं है (यदि आप sys.argv उपयोग करने के लिए चाहते हो सकता है [0] के बजाय)

यह उन डॉक्स कि क्या "exe फ़ाइल" और "निष्पादन" एक ही बात कर रहे हैं से स्पष्ट नहीं है , और इस प्रकार sys.executable और sys.argv[0] एक ही बात है। कोड है कि दोनों script.py और py2exe_executable.exe पिछली बार मैं यह करने के लिए किया था के लिए काम किया को देखते हुए, मैं की तरह कुछ पाते हैं:

if hasattr(sys, 'frozen'): 
    basis = sys.executable 
else: 
    basis = sys.argv[0] 
required_folder = os.path.split(basis)[0] 

मुझे लगता है कि काम किया कहते हैं, लेकिन मैं याद नहीं आता कि क्यों मैंने सोचा था कि के रूप में sys.argv[0] का उपयोग करने के बजाय आवश्यक था।

केवल basis का उपयोग हाथ में नौकरी के लिए पर्याप्त था (उस निर्देशिका में फ़ाइलों को पढ़ें)। अधिक स्थायी रिकॉर्ड के लिए, os.path.realpath(basis) जैसे कुछ विभाजित करें।

अद्यतन वास्तव में एक परीक्षण किया; अनुमान लगाता है और आर्मचेयर पोंटिफिकेशन :-)

सारांश: sys.frozen को अनदेखा करें, sys.executable को अनदेखा करें, sys.argv [0] बिना शर्त के साथ जाएं।

साक्ष्य:

=== foo.py ===

# coding: ascii 
import sys, os.path 
print 'sys has frozen:', hasattr(sys, 'frozen') 
print 'using sys.executable:', repr(os.path.dirname(os.path.realpath(sys.executable))) 
print 'using sys.argv[0]:', repr(os.path.dirname(os.path.realpath(sys.argv[0] ))) 

=== सेटअप।py ===

from distutils.core import setup 
import py2exe 
setup(console=['foo.py']) 

=== परिणाम ===

C:\junk\so\py2exe>\python26\python foo.py 
sys has frozen: False 
using sys.executable: 'C:\\python26' 
using sys.argv[0]: 'C:\\junk\\so\\py2exe' # where foo.py lives 

C:\junk\so\py2exe>dist\foo 
sys has frozen: True 
using sys.executable: 'C:\\junk\\so\\py2exe\\dist' 
using sys.argv[0]: 'C:\\junk\\so\\py2exe\\dist' # where foo.exe lives 
+0

मेरा मानना ​​है कि sys.executable आमतौर पर पाइथन दुभाषिया को इंगित करता है, जो आप py2exe के तहत चाहते हैं, लेकिन अन्यथा नहीं। – prestomation

+0

@ प्रेस्टोमेशन: py2exe मामले में "पायथन दुभाषिया स्वयं" क्या है? आपका मतलब क्या है "लेकिन अन्यथा नहीं"? –

+0

"अन्यथा" तब होता है जब आप एक व्याख्या की गई फ़ाइल चला रहे हैं, जो कि अधिकांश वातावरण है। Py2exe मामले में, मुझे लगता है कि दुभाषिया आपका py2exe है, क्योंकि इसमें शामिल है। ऐसा लगता है कि आपके हालिया संपादन ने पुष्टि की है। – prestomation

8

Py2exe को परिभाषित नहीं करता __file__: http://www.py2exe.org/index.cgi/Py2exeEnvironment

ओ पी के एक py2exe अनुकूल संस्करण का अनुरोध किया:

SCRIPT_ROOT = os.path.dirname(os.path.realpath(__file__)) 

सबसे अच्छा जवाब यह निर्धारित करना है कि क्या अजगर में पायथन जमे हुए है, py2exe में डॉक्यूम है इस पर प्रलेखन: http://www.py2exe.org/index.cgi/HowToDetermineIfRunningFromExe

import imp, os, 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(): 
     return os.path.dirname(sys.executable) 
    return os.path.dirname(os.path.realpath(__file__)) 

SCRIPT_ROOT = get_main_dir() 

के बाद से, अजगर है EAFP, यहाँ एक EAFP संस्करण है ...

try: 
    if sys.frozen or sys.importers: 
     SCRIPT_ROOT = os.path.dirname(sys.executable) 
except AttributeError: 
    SCRIPT_ROOT = os.path.dirname(os.path.realpath(__file__)) 

चीयर्स!

+0

@ क्या आप सही हैं ... मुझे और सावधानी से पढ़ना चाहिए था। बेहतर? – VertigoRay

+1

यह वही है जो सवाल के लिए पूछा गया था। महान समाधान के लिए धन्यवाद। –

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

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