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

StackOverflow https://stackoverflow.com/questions/904170

  •  05-09-2019
  •  | 
  •  

Вопрос

Я обновил свой интерпретатор 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 и не очень хорошо знаком с интерпретируемыми языками, поэтому я не слишком уверен в том, что происходит.

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

Это было полезно?

Решение

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

Другие советы

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

#!/usr/bin/env python

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

Судя по вашему описанию, я подозреваю, что если бы вы сделали:

which python

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

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

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

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

/usr/bin/python -V

2) где находится установленный вами интерпретатор python 3:

which python

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

#!/usr/bin/env python

Добавление: Вы также можете заменить более старую версию python символической ссылкой на python 3, но помните, что любые основные обновления OS X (ie: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

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

Может быть немного странно предоставлять Perl-скрипт для ответа на вопрос Python, но он работает для Python так же хорошо, как и для Perl.Это скрипт под названием 'fixin', что означает "исправить интерпретатор".Это изменяет строку shebang на правильную строку для вашего текущего ПУТИ.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top