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!

È stato utile?

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

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top