2012-04-24 21 views
8

Si está ejecutando una secuencia de comandos python congelada (congelada mediante py2exe) desde un directorio y la unidad es diferente de la secuencia de comandos presente, ¿cuál es la mejor manera de determinar la ruta de la ejecutar el guion?Cómo obtener la ruta de ejecución de la secuencia de comandos congelada

pocas soluciones He tratado

inspect.getfile(inspect.currentframe()) 

Problema: no devuelve la ruta completa. Solo devuelve el nombre del script.

os.path.abspath(__file__) 

Problema: No funciona en Windows

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

Problema: Devuelve una cadena vacía.

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

no funcionará si la unidad es diferente de la PWD

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

no funcionará si la unidad es diferente de la PWD

que aquí hay una no mínimo - ejemplo de trabajo

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 

preguntas relacionadas:

Nota

@ solución de Fenikso funcionarán si el guión reside en la misma unidad en la que se está ejecutando, pero cuando está en una unidad diferente, no va a funcionar

Respuesta

10

Otro enfoque que trabaja con cxFreeze cuando se ejecuta desde otra unidad, incluso utilizando RUTA:

import sys 

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

De Python:

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

Desde la línea de comandos:

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

Usando RUTA:

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

Sí, esto funciona también con py2exe. –

+0

@Fenikso: Esto funciona perfectamente. Antes de publicar esta pregunta, he visto pocas referencias al mismo problema en SO, pero ninguna de las respuestas es correcta per se '. – Abhijit

0

Prueba esto:

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

Eso es lo que uso con cx_Freeze para obtener el directorio desde donde el .exe es realmente corriendo

+0

esto no funcionará si el guión está presente en una unidad diferente – Abhijit

+0

@Abhijit - Lo siento, no entiendo. Esta es una parte fundamental de todos mis scripts congelados y nunca falló. ¿Puedes describir un ejemplo cuando esto falla? – Fenikso

+0

He actualizado el ejemplo para incluir este escenario. Si la unidad es diferente, simplemente devuelve el nombre de la unidad desde donde se está ejecutando. – Abhijit

2

En mi humilde opinión, el código que actúa de manera diferente dependiendo de rutas absolutas no es una buena solución. Probablemente sea mejor una solución de ruta relativa. Use dirname para conocer el directorio relativo y os.sep para la compatibilidad multiplataforma.

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]) 

el atributo "congelado" es el estándar python.

Echa un vistazo también a esky: http://pypi.python.org/pypi/esky

Cuestiones relacionadas