2012-08-29 20 views
5

Trabajando en OS X Lion, estoy tratando de abrir un archivo en mi programa python desde cualquier lugar de la terminal. Yo he dado la siguiente función en mi .bash_profile:abrir (archivo) desde cualquier lugar

function testprogram() {python ~/.folder/.testprogram.py} 

De esta manera puedo (en el terminal) ejecutar mi testprogram de un directorio diferente que mi ~ /.

Ahora, si estoy en mi directorio, y ejecutar el programa, la siguiente funcionaría

infile = open("folder2/test.txt", "r+") 

Sin embargo, si estoy en un directorio diferente de mi casa-carpeta y escribe "testprogram "en la terminal, el programa se inicia pero no puede encontrar el archivo test.txt.

¿Hay alguna forma de que python abra siempre el archivo desde la misma ubicación no afectada desde donde ejecuto el programa?

+0

¿Qué significa el 'testprogram)' función (tiene que ver con el programa de Python? –

Respuesta

8

Si usted quiere que sea multiplataforma que recomendaría

import os 
open(os.path.join(os.path.expanduser('~'),'rest/of/path/to.file')) 
+0

¡Gracias, esto funcionó muy bien! – Noorac

+1

Esa unión es completamente innecesaria. "Pero multipl ..." Ya tiene barras como separadores de ruta en "rest/of/path/to.file", entonces ¿cómo podría ser "~/rest/of/path/to.file" un problema? –

+0

lol buen punto ... también python siempre trata '/' como separadores de rutas así que meh ..: P –

8

Use la tilde para representar la carpeta de inicio, tal como lo haría en el .bash_profile, y use os.path.expanduser.

import os 
infile = open(os.path.expanduser("~/folder2/test.txt"), "r+") 
+0

¿Has probado eso? No parece funcionar para mi –

+1

@JoachimIsaksson: Lo siento, olvidé agregar 'os.path.expanduser'. –

0

Esto no es diferente a hacer referencia a un archivo a través de cualquier cosa además de Python, necesita utilizar una ruta absoluta en lugar de una relativa.

Si desea consultar los archivos relativos a la ubicación de la secuencia de comandos, también puede utilizar el atributo __file__ en su módulo para obtener la ubicación del módulo en ejecución.

También, en lugar de utilizar una función de shell, acaba de dar su secuencia de comandos de una línea shebang (#!/usr/bin/env python), chmod +x y ponerla en algún lugar en su PATH.

+0

Uso el método env aquí descrito regularmente. Dependiendo de cómo use módulos personalizados, es posible que deba actualizar su PYTHONPATH también. – DrSkippy

0

Usted simplemente puede ejecutar la función en un subnivel para que pueda cd casa antes de ejecutarlo:

function testprogram() { (
    cd && python .folder/.testprogram.py 
) } 
-1

utilizar tanto la ruta completa como

/path/to/my/folder2/test.txt 

o abreviado uno

~/folder2/test.txt 
0

En python sys.argv[0] se establecerá en la ruta de la secuencia de comandos (si k nown). Puede usar esto más las funciones en os.path para acceder a los archivos relativos al directorio que contiene el script. Por ejemplo

import sys, os.path 

script_path = sys.argv[0] 
script_dir = os.path.dirname(script_path) 

def script_relative(filename): 
    return os.path.join(script_dir, filename) 

infile = open(script_relative("folder2/test.txt"), "r+") 

David Robinson señala que sys.argv[0] no puede ser una ruta completa. En lugar de usar sys.argv[0], puede usar __file__ si este es el caso.

+0

'sys.argv [0]' no se garantiza que proporcione la ruta desde el directorio actual al script. Por ejemplo, el script podría estar en la ruta del usuario. –

+0

@DavidRobinson, eh, 'pydoc sys' implica que siempre es un nombre de ruta, pero http://docs.python.org/library/sys.html dice que podría no serlo. Así que sugerí usar '__file__' en su lugar. –

Cuestiones relacionadas