L'interprete python sbagliato è chiamato
-
05-09-2019 - |
Domanda
ho aggiornato il mio interprete Python, ma penso che il vecchio è ancora chiamato. Quando controllo per la versione ottengo:
$ python -V
Python 3.0.1
Ma credo che il vecchio interprete è ancora in fase di chiamata. Quando faccio funzionare il comando:
python myProg.py
Lo script viene eseguito correttamente. Ma quando invoco con il comando
./myProg.py
ottengo il messaggio di errore:
AttributeError: 'str' object has no attribute 'format'
che a quanto pare è dovuto al vecchio interprete chiamato. Come posso risolvere questo problema? Corro Mac OS X 10.5. Ha qualcosa a che fare con la prima linea:
#!/usr/bin/python
Ho appena iniziato con pitone e non sono molto familiare con linguaggi interpretati, quindi non sono troppo sicuro di quello che sta succedendo.
Edit: Wow, che è stato veloce. Grazie mille!
Soluzione
Secondo la prima riga dello script, #!/usr/bin/python
, si sta chiamando l'interprete Python in /usr/bin/python
(che è più probabile quello che viene fornito con Mac OS X). Devi cambiare il percorso per il percorso in cui è stato installato il Python 3 interprete (probabilmente /usr/local/bin/python
o /opt/local/bin/python
); o si può semplicemente cambiare quella linea di leggere #!/usr/bin/env python
, che chiamerà il python
elencato per primo nella variabile PATH
(che sembra essere la versione più recente è stato installato).
Altri suggerimenti
In primo luogo, la linea di shebang consigliato è:
#!/usr/bin/env python
Questo farà in modo l'interprete Python che viene richiamato quando si ./foo.py
è lo stesso interprete che è invocato quando si richiama pitone dalla riga di comando.
Dalla tua descrizione, ho il sospetto che se avete fatto:
which python
Non darebbe /usr/bin/python
. Sarebbe darvi qualcosa di diverso, che è dove vive l'interprete Python 3. Si sia possibile modificare la linea di shebang a quanto sopra, o sostituire il percorso per l'interprete Python con il percorso restituito da which
.
Prova which python
. Vi dirò che interprete Python viene utilizzato nel proprio ambiente.
Se non è /usr/bin/python
come nello script, allora il vostro sospetto è confermato.
E 'molto probabilmente quello che si sospetta, che la linea shebang sta chiamando la versione precedente. Due cose che si potrebbe desiderare di controllare:
1) che versione è l'interprete in / usr / bin / python:
/usr/bin/python -V
2) dove è l'interprete Python 3 è stato installato:
which python
Se si ottiene il corretto dalla riga di comando, quindi sostituire la vostra linea shebang con questo:
#!/usr/bin/env python
Addendum: Si potrebbe anche sostituire la versione precedente di pitone con un link simbolico a Python 3, ma attenzione che eventuali aggiornamenti importanti OS X (es: 10.5.6 a 10.5.7) sarà probabilmente pausa in questo modo:
sudo mv /usr/bin/python /usr/bin/python25
sudo ln -s /path/to/python/3/python /usr/bin/python
run 'che python' -. Se questo dà una risposta diversa da / usr / bin / python, cambiamento # / usr / bin / python di avere, invece, che il percorso
Può essere un po 'strano che fornisce uno script in Perl per rispondere a una domanda di Python, ma funziona per Python altrettanto bene come fa per Perl. Questo è uno script chiamato 'fixin
', che significa 'fix interprete'. Cambia lo shebang alla stringa corretta per il percorso corrente.
#!/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+"\$@"}'
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;
}
Il codice è derivato da uno script con lo stesso nome in originale Camel Book ( 'Programming Perl', prima edizione). Questa copia è stato violato un po 'da allora - e deve essere inciso un po'. Ma io lo uso regolarmente - anzi, ho solo copiato da un Mac ad un altro, e dal momento che non ho installato Perl 5.10.0 al secondo, mi sono imbattuto:
$ perl fixin fixin
Changing fixin to /usr/bin/perl
$
In tal modo il passaggio dal privato installare Perl a quella standard.
esercizio per il lettore - riscrivere lo script in Python
.