2012-03-22 13 views
6

Una diferencia es que "./script.py" solo funciona si script.py es ejecutable (como en permisos de archivos), pero "python script.py" funciona independientemente. Sin embargo, sospecho fuertemente que hay más diferencias, y quiero saber cuáles son.Al invocar un script de Python, ¿cuál es la diferencia entre "./script.py" y "python script.py"

Tengo un sitio web de Django, y "python manage.py syncdb" funciona bien, pero "./manage.py syncdb" crea una base de datos rota por alguna razón que sigue siendo un misterio para mí. Tal vez tiene que ver con el hecho de que syncdb pide un nombre de superusuario y una contraseña desde la línea de comandos, y tal vez usar "./manage.py syncdb" cambia la forma en que interactúa con la línea de comando, lo que hace que se modifique la contraseña. ¿Tal vez? Estoy desconcertado por este error. "python manage.py syncdb" lo arregla completamente, así que esto es solo curiosidad.

Gracias.

Editar: Bien, bien, me olvidé de la necesidad de la línea de shebang #!/Usr/bin/python. Pero acabo de comprobar, "python manage.py syncdb" y "syncdb ./manage.py" están utilizando el mismo intérprete de Python (2.7.2, el único instalado, en Linux Mint 12). Sin embargo, el primero funciona y el segundo no.

¿Podrían las variables de entorno vistas por el código de Python ser diferentes? Mi código requiere $ LD_LOADER_PATH y $ PYTHON_PATH para ser especial para cada shell.

Respuesta

6

Llamando ./script.py usa la "línea shebang" en la secuencia de comandos para determinar qué intérprete utilizar para ejecutar la secuencia de comandos. Tal línea podría ser similar

#!/usr/bin/env python 

o

#!/usr/bin/python2.7 

o cualquier ruta de acceso al intérprete de Python se utiliza. Si se resuelve con el mismo intérprete de Python que se llama con sólo

python 

desde la línea de comandos shell, no hay ninguna diferencia entre ./script.py y python script.py, pero la versión de dos puede terminar usando diferentes intérpretes de Python.

0

./script.py ejecuta el intérprete definido en el #! al comienzo del archivo. Por ejemplo, la primera línea podría ser #! /usr/bin/env python o #! /usr/bin/python o algo por el estilo. Si observa qué intérprete se invoca, es posible que pueda solucionar ese problema.

1

./script.py = "Intento de ejecutar un archivo llamado script.py en el shell actual"

python script.py = "Enviar script.py como un argumento a la primera python ejecutable en el actual $PATH"

La primera sólo funciona si el archivo tiene el bit de ejecución establecido para el usuario que intenta ejecutar el archivo y que tiene la llamada línea shebang, que le dice al shell cómo ejecutarlo.

0

En Linux con terminal puede ejecutar cualquier archivo -si el usuario tiene permiso de ejecución- escribiendo ./fileName. Cuando el sistema operativo ve un encabezado válido como #! /usr/bin/python (o para perl #! /usr/bin/python), llamará al intérprete python o perl (apropiado) para ejecutar el programa.Puede usar el comando python script.py directamente porque, python es un programa ejecutable ubicado en /usr/bin (o en otro lugar) que se encuentra en una variable de entorno $ PATH, que corresponde al directorio de ejecutables.

Cuestiones relacionadas