2011-05-01 7 views
15

¿Hay alguna diferencia entre:Diferencia entre __file__ y sys.argv [0]

__file__

y

sys.argv[0]

Debido a que ambos parecen estar haciendo lo mismo: que poseen el nombre del guion

Si no hay ninguna diferencia, entonces por qué es que __file__ se utiliza en casi todos los someplaces mientras que nunca he visto sys.argv[0] siendo utilizados.

Respuesta

11

__file__ es el nombre del archivo actual, que puede ser diferente de la secuencia de comandos principal, si está dentro de un módulo o si se inicia una secuencia de comandos con execfile() en lugar de mediante la invocación de python scriptname.py. __file__ es generalmente su apuesta más segura.

+0

Eso lo explica. – user225312

+1

sys.argv [0] puede ser incluso un nombre de módulo en lugar de un nombre de archivo si su script se ejecutó con el modificador '-m', o un directorio o nombre de archivo zip si está utilizando la ejecución incluida. – ncoghlan

+0

¿No se supone que \ __ file \ __ se considera privado y, por lo tanto, no se ha consultado directamente? – Tiago

4

Es lo mismo si se encuentra en el script "principal" de su programa python. Si importa otros archivos, __file__ contendrá la ruta a ese archivo, pero sys.argv aún tendrá los mismos valores.

2

Es como Sven dijo.

[email protected]: /tmp > cat file.py 
import sys 
import blub 
print __file__ 
print sys.argv[0] 

[email protected]: /tmp > cat blub.py 
import sys 
print "BLUB: " + __file__ 
print "BLUB: " + sys.argv[0] 

[email protected]: /tmp > python file.py 
BLUB: /tmp/blub.pyc 
BLUB: file.py 
file.py 
file.py 

pensé que __file__ fue reemplazado con el nombre de archivo durante una etapa de preprocesador. No estaba 100% seguro de que ese fuera el caso en Python, pero está en C/C++ y Perl. En Python, esto podría ser diferente ya que el __file__ también es correcto para los archivos compilados de Python (pyc), y no parece haber ningún rastro del nombre del archivo en el contenido de ese archivo.

+0

Ludwig: Probablemente deberías hacer más experimentación. Crea un archivo vacío llamado 'empty.py'. En el indicador interactivo de Python, ingrese esta línea: 'import empty; imprimir (vacío .__ archivo__); recargar (vaciar); imprima (vacío .__ archivo __) '... luego edite su respuesta. –

+0

Supongo que tienes razón: he actualizado mi respuesta. Gracias. – Lumi

+0

Ludwig: Hechos: '__file__' es un atributo del módulo, creado automáticamente cuando se carga el módulo. CPython no tiene un paso de preprocesador. –

Cuestiones relacionadas