Aquí es el py2exe documentation reference y aquí están los artículos pertinentes:
sys.executable
se establece en la ruta completa del archivo EXE.
- El primer elemento en
sys.argv
es la ruta de acceso completa del ejecutable, el resto son los argumentos de la línea de comandos.
sys.frozen
solo existe en el ejecutable. Se establece en "console_exe" para un ejecutable de consola, en "windows_exe" para un ejecutable gui sin consola y en "dll" para un servidor dll en proceso.
__file__
no está definido (es posible que desee utilizar sys.argv [0] en lugar)
No se desprende de dichos documentos ya sea "el archivo EXE" y "ejecutable" son la misma cosa , y por lo tanto si sys.executable
y sys.argv[0]
son lo mismo. En cuanto a código que trabajó tanto para script.py y py2exe_executable.exe última vez que tuve que hacer esto, me parece algo así como:
if hasattr(sys, 'frozen'):
basis = sys.executable
else:
basis = sys.argv[0]
required_folder = os.path.split(basis)[0]
Como digo que funcionó, pero no recuerdo por qué pensé que fue necesario en lugar de solo usar sys.argv[0]
.
El uso solo de basis
fue adecuado para el trabajo en cuestión (lea los archivos en ese directorio). Para un registro más permanente, divida algo como os.path.realpath(basis)
.
Actualización En realidad hice una prueba; conjeturas de golpes y pontificación de sillón :-)
Resumen: Ignore sys.frozen, ignore sys.executable, vaya con sys.argv [0] incondicionalmente.
Evidencia:
=== === 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] )))
=== configuración.py ===
from distutils.core import setup
import py2exe
setup(console=['foo.py'])
resultados === ===
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
Hay una pregunta duplicada anterior pero con menos respuestas: [Determinando la ruta de la aplicación en un EXE Python generado por pyInstaller] (http://stackoverflow.com/questions/404744) – olibre