Вызывается неправильный интерпретатор python

Я обновил свой интерпретатор python, но я думаю, что старый по-прежнему называется. Когда я проверяю версию, я получаю:

$ python -V
Python 3.0.1

Но я считаю, что старый интерпретатор все еще называется. Когда я запускаю команду:

python myProg.py

script работает правильно. Но когда я вызываю его с помощью команды

./myProg.py

Я получаю сообщение об ошибке:

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

Похоже, что это вызвано вызовом старого интерпретатора. Как я могу это исправить? Я запускаю Mac OS X 10.5. Связано ли это с первой строкой:

#!/usr/bin/python

Я только начинал с python и не очень хорошо разбираюсь в интерпретируемых языках, поэтому я не уверен, что происходит.

Изменить: Вау, это было быстро. Большое спасибо!

Ответ 1

В соответствии с первой строкой script, #!/usr/bin/python вы вызываете интерпретатор Python в /usr/bin/python (что, скорее всего, тот, который поставляется с Mac OS X). Вы должны изменить этот путь на путь, где вы установили ваш интерпретатор Python 3 (вероятно, /usr/local/bin/python или /opt/local/bin/python); или вы можете просто изменить эту строку, чтобы прочитать #!/usr/bin/env python, которая будет вызывать python, указанную первым в вашей переменной PATH (которая, кажется, более новая версия, которую вы установили).

Ответ 2

Во-первых, рекомендуемая строка shebang:

#!/usr/bin/env python

Это гарантирует, что интерпретатор python, который вызывается, когда вы ./foo.py - это тот же интерпретатор, который вызывается при вызове python из командной строки.

Из вашего описания, я подозреваю, что если вы это сделали:

which python

Это не даст вам /usr/bin/python. Это даст вам что-то еще, в котором живет интерпретатор python 3. Вы можете либо изменить свою линию shebang на выше, либо заменить путь к интерпретатору python с помощью пути, возвращаемого which.

Ответ 3

Попробуйте which python. Я расскажу вам, какой интерпретатор python используется в вашей среде. Если это не /usr/bin/python, как в script, ваше подозрение подтверждается.

Ответ 4

Это очень возможно, что вы подозреваете, что линия shebang вызывает более старую версию. Две вещи, которые вы можете проверить:

1) какая версия является интерпретатором в /usr/bin/python:

/usr/bin/python -V

2) где установлен интерпретатор python 3:

which python

Если вы получите правильный код из командной строки, замените строку shebang следующим образом:

#!/usr/bin/env python

Добавление:. Вы также можете заменить старую версию python символической ссылкой на python 3, но будьте осторожны, что любые основные обновления OS X (то есть: от 10.5.6 до 10.5.7), скорее всего, сломаются это:

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

Ответ 5

run ', который python' - если это дает другой ответ, чем /usr/bin/python, замените #!/usr/bin/python таким образом.

Ответ 6

Это может быть немного странно, если Perl script отвечает на вопрос Python, но он работает для Python так же хорошо, как и для Perl. Это script, называемый 'fixin', что означает "исправить интерпретатор". Он изменяет строку shebang на правильную строку для вашего текущего PATH.

#!/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;
}

Код выводится из script с тем же именем в оригинальной книге Camel ('Programming Perl', первое издание). С тех пор эта копия немного взломана - и ее нужно взломать еще немного. Но я использую его регулярно - действительно, я просто скопировал его с одного Mac на другой, и, поскольку я не установил Perl 5.10.0 на второй, я побежал:

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

Таким образом, переход от частной установки Perl к стандартному.

Упражнение для читателя - перепишите script в Python.