El intérprete de Python incorrecto se llama

Actualicé mi intérprete de python, pero creo que el antiguo todavía se llama. Cuando busco la versión que obtengo:

$ python -V Python 3.0.1 

Pero creo que el viejo intérprete todavía está siendo llamado. Cuando ejecuto el comando:

 python myProg.py 

El script se ejecuta correctamente. Pero cuando lo invoco con el comando.

 ./myProg.py 

Me sale el mensaje de error:

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

Lo que aparentemente se debe a que el viejo intérprete fue llamado. ¿Cómo puedo arreglar esto? Ejecuto Mac OS X 10.5. Tiene algo que ver con la primera línea:

 #!/usr/bin/python 

Acabo de empezar con Python y no estoy muy familiarizado con los idiomas interpretados, así que no estoy muy seguro de lo que está pasando.

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

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

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

 #!/usr/bin/env python 

Esto asegurará que el intérprete de python que se invoca cuando ./foo.py sea ​​el mismo intérprete que se invoca cuando invocas python desde la línea de comandos.

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

 which python 

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

Intenta con which python . Le diré qué intérprete de python se utiliza en su entorno. Si no es /usr/bin/python como en el script, entonces su sospecha se confirma.

Es muy posible que sospeche que la línea shebang está llamando a la versión anterior. Dos cosas que usted podría querer comprobar:

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

 /usr/bin/python -V 

2) ¿dónde está el intérprete de python 3 que instaló:

 which python 

Si obtienes el correcto de la línea de comando, entonces reemplaza tu línea shebang con esto:

 #!/usr/bin/env python 

Addendum: también puede reemplazar la versión anterior de python con un enlace simbólico a python 3, pero tenga en cuenta que cualquier actualización importante de OS X (es decir, 10.5.6 a 10.5.7) probablemente romperá esto:

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

ejecute ‘which python’ – si esto da una respuesta diferente a / usr / bin / python, cambie #! / usr / bin / python para tener ese camino en su lugar.

Puede ser un poco extraño proporcionar un script de Perl para responder una pregunta de Python, pero funciona para Python tan bien como lo hace para Perl. Este es un script llamado ‘ fixin ‘, que significa ‘intérprete de arreglos’. Cambia la línea de shebang a la cadena correcta para tu PATH 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); $_ = ; 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 { $_ = <$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 () { print; } close IN; close OUT; } 

El código se deriva de un guión del mismo nombre en el libro original de camellos (‘Programming Perl’, primera edición). Esta copia ha sido hackeada un poco desde entonces y debería ser hackeada un poco más. Pero lo uso de forma rutinaria, de hecho, lo copié de una Mac a otra, y como no instalé Perl 5.10.0 en la segunda, ejecuté:

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

De este modo se cambia de la instalación privada de Perl a la estándar.

Ejercicio para el lector: reescriba el script en Python.