Ecco l'py2exe documentation reference e qui ci sono le voci pertinenti:
sys.executable
è impostato per il percorso completo del file exe.
- Il primo elemento in
sys.argv
è il percorso completo dell'eseguibile, il resto sono gli argomenti della riga di comando.
sys.frozen
esiste solo nell'eseguibile. È impostato su "console_exe" per un eseguibile della console, su "windows_exe" per un eseguibile di gui senza console e su "dll" per un server di dll in elaborazione.
__file__
non è definito (si potrebbe desiderare di usare sys.argv [0] invece)
Non è Da tali documenti se "il file exe" e "l'eseguibile" sono la stessa cosa e quindi se sys.executable
e sys.argv[0]
sono la stessa cosa. Guardando il codice che ha lavorato sia per script.py e py2exe_executable.exe ultima volta che ho dovuto fare questo, trovo qualcosa di simile:
if hasattr(sys, 'frozen'):
basis = sys.executable
else:
basis = sys.argv[0]
required_folder = os.path.split(basis)[0]
Come dico che ha funzionato, ma non mi ricordo perché ho pensato che era necessario invece di usare solo sys.argv[0]
.
Utilizzare solo basis
era adeguato per il lavoro in corso (leggere i file in tale directory). Per una registrazione più permanente, dividi qualcosa come os.path.realpath(basis)
.
Aggiornamento Effettuato effettivamente un test; beat supposizione e pontificazione poltrona :-)
Riepilogo: Ignora sys.frozen, ignora sys.executable, vai con sys.argv [0] incondizionatamente.
Evidence:
=== === 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] )))
=== setup.py ===
from distutils.core import setup
import py2exe
setup(console=['foo.py'])
risultati === ===
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
fonte
2010-02-18 23:47:33
C'è una domanda duplicata precedente ma con meno risposte: [Determinazione del percorso dell'applicazione in un EXE Python generato da pyInstaller] (http://stackoverflow.com/questions/404744) – olibre