2011-02-08 25 views
325

Consideremos el siguiente código Python:¿Cómo puedo encontrar el directorio de scripts con Python?

import os 
print os.getcwd() 

utilizo os.getcwd()-get the script file's directory location. Cuando ejecuto el script desde la línea de comando, me da la ruta correcta, mientras que cuando lo ejecuto desde un script ejecutado por código en una vista de Django, imprime /.

¿Cómo puedo obtener la ruta al script desde un script ejecutado por una vista de Django?

ACTUALIZACIÓN:
Resumiendo las respuestas hasta el momento - os.getcwd() y os.path.abspath() ambos dan el directorio de trabajo actual, que puede o no ser el directorio donde reside el guión. En mi configuración de host web __file__ solo aparece el nombre del archivo sin la ruta.

¿Hay alguna forma en Python para (siempre) poder recibir la ruta en la que reside el script?

+1

usted debe leer este artículo relacionado más de cerca. Nunca sugiere el uso de 'getcwd' que le dirá la ubicación de su script. Sugiere 'argv [0]', 'dirname', y' abspath'. –

+0

@Rob - "print sys.argv [0]" en mi servidor web solo da el nombre de archivo, sin la ruta – Jonathan

+0

@Rob - aquí hay un extracto del artículo vinculado "os.getcwd() devuelve el directorio actual de trabajo." – Jonathan

Respuesta

510

Necesitas llamar os.path.realpath en __file__, de modo que cuando __file__ es un nombre de archivo sin la ruta sigue recibiendo el camino dir:

import os 
print(os.path.dirname(os.path.realpath(__file__))) 
+30

Esto no funcionará si está ejecutando desde dentro de un intérprete, ya que obtendrá 'NameError: name '__file__' no está definido' –

+0

@EhteshChoudhury ¿Qué quiere decir? por 'ejecutando desde dentro de un intérprete' –

+2

Intenta ejecutar' python -c 'import os; imprima os.path.dirname (os.path.realpath (__ file __)) '', que es un conjunto de comandos ejecutados por un intérprete de python. –

3

Uso os.path.abspath('')

+0

Esto funciona para todo en mi máquina de desarrollo, pero solo para archivos de script en mi servidor web. No funciona para settings.py, p. lo siguiente no funciona: TEMPLATE_DIRS = ((os.path.abspath ('') + '/ templates'),) – Jonathan

12
import os,sys 
# Store current working directory 
pwd = os.path.dirname(__file__) 
# Append current directory to the python path 
sys.path.append(pwd) 
+0

Esto funciona muy bien en mi máquina de desarrollo, pero no funciona en mi servidor web - Obtengo '/ ' – Jonathan

+0

Extraño, ¿tiene acceso a los archivos conf de apache? ¿O es esto un servidor de Windows? – jbcurtin

104

que utilizo:

import os 
import sys 

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

Como Aiham señala en un comentario, puede definir esta función en un módulo y utilizarlo en diferentes guiones.

+9

+1 porque el atributo del módulo '__file__' no siempre está definido. – iacopo

+4

Esto también es útil si desea colocar getScriptPath() en un módulo diferente pero obtener la ruta del archivo que se ejecutó realmente en lugar de la ruta del módulo. – aiham

+0

@aiham: Buen punto. De hecho, esta función está en mi módulo utils framework :) – neuro

91

Probar sys.path[0].

citar la documentación de Python:

As initialized upon program startup, the first item of this list, path[0] , is the directory containing the script that was used to invoke the Python interpreter. If the script directory is not available (e.g. if the interpreter is invoked interactively or if the script is read from standard input), path[0] is the empty string, which directs Python to search modules in the current directory first. Notice that the script directory is inserted before the entries inserted as a result of PYTHONPATH .

Fuente: https://docs.python.org/library/sys.html#sys.path

+8

+1 para citar documentos –

+1

esta suele ser la solución correcta – vidstige

+2

Esta es la solución correcta. – Mike

-1
import os 
exec_filepath = os.path.realpath(__file__) 
exec_dirpath = exec_filepath[0:len(exec_filepath)-len(os.path.basename(__file__))] 
+1

¿Por qué no usar os.path.dirname? – SpoonMeiser

+0

No sabía sobre os.path.dirname, tal vez eso también funciona. – Stan

6
import os 
script_dir = os.path.dirname(os.path.realpath(__file__)) + os.sep 
+0

Gracias, necesitaba el os.sep: D –

14

este código:

import os 
dn = os.path.dirname(os.path.realpath(__file__)) 

conjuntos "dn" al nombre del directorio que contiene la secuencia de comandos actualmente en ejecución. Este código:

fn = os.path.join(dn,"vcb.init") 
fp = open(fn,"r") 

conjuntos "fn" a "script_dir/vcb.init" (de una manera independiente de la plataforma) y se abre ese archivo para la lectura por el script se está ejecutando actualmente.

Tenga en cuenta que "el script actualmente en ejecución" es algo ambiguo. Si todo el programa consta de 1 secuencia de comandos, entonces esa es la secuencia de comandos que se está ejecutando actualmente y la solución "sys.path [0]" funciona bien. Pero si su aplicación consiste en el script A, que importa un paquete "P" y luego llama al script "B", entonces "P.B "se está ejecutando actualmente. Si necesita obtener el directorio que contiene" PB ", quiere la solución" os.path.realpath(__file__) "

" __file__ "simplemente da el nombre del script actualmente en ejecución (parte superior de la pila): "x.py". No hace dar ninguna información de ruta. Es la llamada "os.path.realpath" que hace el trabajo real.

2

Este es un hilo muy viejo, pero he estado teniendo este problema al intentar guardar archivos en el directorio actual, el script está en ejecución cuando se ejecuta una secuencia de comandos python desde una tarea cron. getcwd() y muchas otras rutas aparecen con su directorio principal.

para obtener una ruta de acceso absoluta a la secuencia de comandos que utiliza

directory = os.path.abspath(os.path.dirname(__file__))

2

Esto es lo que terminó con. Esto funciona para mí si puedo importar mi guión en el intérprete, y también si ejecuto como una secuencia de comandos:

import os 
import sys 

# Returns the directory the current script (or interpreter) is running in 
def get_script_directory(): 
    path = os.path.realpath(sys.argv[0]) 
    if os.path.isdir(path): 
     return path 
    else: 
     return os.path.dirname(path) 
0

Prueba esto:

def get_script_path(for_file = None): 
    path = os.path.dirname(os.path.realpath(sys.argv[0] or 'something')) 
    return path if not for_file else os.path.join(path, for_file) 
Cuestiones relacionadas