2009-05-24 21 views
10

Actualicé mi intérprete de Python, pero creo que todavía se llama al antiguo. Cuando compruebo la versión que obtengo:El intérprete de Python incorrecto se llama

$ python -V 
Python 3.0.1 

Pero creo que todavía se está llamando al antiguo intérprete. Cuando ejecuto el comando:

python myProg.py 

La secuencia de comandos se ejecuta correctamente. Pero cuando invoco con el comando

./myProg.py 

consigo el mensaje de error:

AttributeError: 'str' object has no attribute 'format' 

que al parecer se debe a la edad intérprete que se llama. ¿Cómo puedo arreglar esto? Ejecuto Mac OS X 10.5. Tiene algo que ver con la primera línea:

#!/usr/bin/python 

simplemente empecé con Python y no estoy muy familiarizado con lenguajes interpretados, así que no estoy muy seguro de lo que está pasando.

Edit: Wow, eso fue rápido. ¡Muchas gracias!

Respuesta

16

De acuerdo con la primera línea del script, #!/usr/bin/python, está llamando al intérprete de Python al /usr/bin/python (que probablemente sea el que se envía con Mac OS X). Debe cambiar esa ruta a la ruta donde instaló su intérprete de Python 3 (probablemente /usr/local/bin/python o /opt/local/bin/python); o puede simplemente cambiar esa línea para leer #!/usr/bin/env python, que llamará primero al python en su variable PATH (que parece ser la versión más reciente que instaló).

2

ejecutar 'which python' - si esto da una respuesta diferente de/usr/bin/python, cambie #!/Usr/bin/python para tener esa ruta en su lugar.

3

Probar which python. Te diré qué intérprete de Python se usa en tu entorno. Si no está /usr/bin/python como en el guión, entonces su sospecha queda confirmada.

6

En primer lugar, la línea shebang recomendada es:

#!/usr/bin/env python 

Esto se asegurará de que el intérprete de Python que se invoca cuando se ./foo.py es el mismo intérprete que se invoca cuando se invoca Python desde la línea de comandos.

Desde su descripción, sospecho que si lo hizo:

which python 

Sería no /usr/bin/python dar. Te daría algo más, que es donde vive el intérprete de Python 3. Puede modificar su línea shebang a la anterior, o reemplazar la ruta al intérprete python con la ruta devuelta por which.

3

Es muy posiblemente lo que sospecha, que la línea shebang está llamando a la versión anterior.Hay dos cosas que es posible que desee comprobar:

1) qué versión es la intérprete en/usr/bin/python:

/usr/bin/python -V 

2) donde se encuentra el intérprete de Python 3 que ha instalado:

which python 

Si tienes la opción correcta en la línea de comandos, a continuación, reemplazar su línea con este tinglado:

#!/usr/bin/env python 

Adición: También podría sustituir a la versión anterior del pitón con un enlace a Python 3, pero ten en cuenta que cualquier grandes actualizaciones OS X (es decir: 10.5.6 a 10.5.7) es probable que romper este:

sudo mv /usr/bin/python /usr/bin/python25 
sudo ln -s /path/to/python/3/python /usr/bin/python 
+7

Probablemente no sea la mejor idea reemplazar/usr/bin/python con un enlace simbólico. Algunas utilidades OS X pueden referirse a/usr/bin/python, y dado que Python 3K no es 100% compatible con Python 2.x, corre el riesgo de romper algunas de esas utilidades. – mipadi

+1

Sí, recomendaría no meterme con el Python que viene con OS X. –

+0

Recomiendo especialmente no reemplazar el sistema python con una versión deliberadamente incompatible (siendo Python 3.x) – Arafangion

1

Puede ser un poco extraño proporcionar un script de Perl para responder una pregunta de Python, pero funciona tanto para Python como para Perl. Este es un script llamado 'fixin', que significa 'arreglar intérprete'. Cambia la línea shebang a la cadena correcta para su RUTA actual.

#!/Users/jleffler/perl/v5.10.0/bin/perl 
# 
# @(#)$Id: fixin.pl,v 1.3 2003/03/11 21:20:08 jleffler Exp $ 
# 
# FIXIN: from Programming Perl 
# Usage: fixin [-s] [file ...] 

# Configuration 
$does_hashbang = 1;  # Kernel recognises #! 
$verbose = 1;   # Verbose by default 

# Construct list of directories to search. 
@absdirs = reverse grep(m!^/!, split(/:/, $ENV{'PATH'}, 999)); 

# Process command line arguments 
if ($ARGV[0] eq '-s') 
{ 
    shift; 
    $verbose = 0; 
} 
die "Usage: $0 [-s] [file ...]\n" unless @ARGV || !-t; 

@ARGV = '-' unless @ARGV; 

# Process each file. 
FILE: foreach $filename (@ARGV) 
{ 
    open(IN, $filename) || ((warn "Can't process $filename: $!\n"), next); 
    $_ = <IN>; 
    next FILE unless /^#!/;  # Not a hash/bang file 

    chop($cmd = $_); 
    $cmd =~ s/^#! *//; 
    ($cmd, $arg) = split(' ', $cmd, 2); 
    $cmd =~ s!^.*/!!; 

    # Now look (in reverse) for interpreter in absolute path 
    $found = ''; 
    foreach $dir (@absdirs) 
    { 
     if (-x "$dir/$cmd") 
     { 
      warn "Ignoring $found\n" if $verbose && $found; 
      $found = "$dir/$cmd"; 
     } 
    } 

    # Figure out how to invoke interpreter on this machine 
    if ($found) 
    { 
     warn "Changing $filename to $found\n" if $verbose; 
     if ($does_hashbang) 
     { 
      $_ = "#!$found"; 
      $_ .= ' ' . $arg if $arg ne ''; 
      $_ .= "\n"; 
     } 
     else 
     { 
      $_ = <<EOF; 
: 
eval 'exec $found $arg -S \$0 \${1+"\[email protected]"}' 
    if \$running_under_some_shell; 
EOF 
     } 
    } 
    else 
    { 
     warn "Can't find $cmd in PATH, $filename unchanged\n" if $verbose; 
     next FILE; 
    } 

    # Make new file if necessary 
    if ($filename eq '-') { select(STDOUT); } 
    else 
    { 
     rename($filename, "$filename.bak") || 
      ((warn "Can't modify $filename"), next FILE); 
     open(OUT, ">$filename") || 
      die "Can't create new $filename: $!\n"; 
     ($def, $ino, $mode) = stat IN; 
     $mode = 0755 unless $dev; 
     chmod $mode, $filename; 
     select(OUT); 
    } 

    # Print the new #! line (or the equivalent) and copy the rest of the file. 
    print; 
    while (<IN>) 
    { 
     print; 
    } 
    close IN; 
    close OUT; 
} 

El código se deriva de un guión del mismo nombre en el original libro Camel ('programación Perl', primera edición). Esta copia ha sido pirateada un poco desde entonces, y debería ser pirateada un poco más. Pero lo uso de manera rutinaria - de hecho, sólo copié de un Mac a otro, y ya que no he instalado Perl 5.10.0 en el segundo, me encontré:

$ perl fixin fixin 
Changing fixin to /usr/bin/perl 
$ 

De esta manera el cambio de la instalación privada Perl al estándar.

Ejercicio para el lector: vuelva a escribir el script en Python.

Cuestiones relacionadas