Неправильный интерпретатор Python называется - PullRequest
11 голосов
/ 24 мая 2009

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

$ python -V
Python 3.0.1

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

python myProg.py

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

./myProg.py

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

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

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

#!/usr/bin/python

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

Редактировать: Вау, это было быстро. Большое спасибо!

Ответы [ 6 ]

16 голосов
/ 24 мая 2009

Согласно первой строке скрипта, #!/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 (которая, кажется, является более новой установленной вами версией).

6 голосов
/ 24 мая 2009

Во-первых, рекомендуемая линия Шебанга:

#!/usr/bin/env python

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

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

which python

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

3 голосов
/ 24 мая 2009

Очень вероятно, что вы подозреваете, что линия Шебанга называет старую версию. Вы можете проверить две вещи:

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
3 голосов
/ 24 мая 2009

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

2 голосов
/ 24 мая 2009

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

1 голос
/ 02 августа 2009

Может быть немного странно предоставлять Perl-скрипт для ответа на вопрос по Python, но он работает для Python так же, как и для Perl. Это скрипт с именем «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+"\$@"}'
    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;
}

Код получен из сценария с тем же именем в оригинальной Книге верблюдов («Программирование на Perl», первое издание). Эта копия была взломана с тех пор - и должна быть взломана еще немного. Но я использую его регулярно - действительно, я просто скопировал его с одного Mac на другой, и, поскольку я не установил Perl 5.10.0 на второй, я запустил:

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

Тем самым переходя с частной установки Perl на стандартную.

Упражнение для читателя - переписать скрипт на Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...