2009-05-24 2 views
10

Я обновил свой интерпретатор python, но я думаю, что старый по-прежнему называется. Когда я проверяю версию, я получаю:Неправильный интерпретатор 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 

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

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

ответ

16

В соответствии с первой строкой сценария #!/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

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

3

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

6

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

#!/usr/bin/env python 

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

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

which python 

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

3

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

1) какая версия является переводчиком в/USR/BIN/Python:

/usr/bin/python -V 

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

which python 

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

#!/usr/bin/env 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 
+7

Это, вероятно, не самая лучшая идея - заменить/usr/bin/python символической ссылкой. Некоторые утилиты OS X могут ссылаться на/usr/bin/python, и поскольку Python 3K не на 100% обратно совместим с Python 2.x, вы рискуете нарушить некоторые из этих утилит. – mipadi

+1

Да, я бы порекомендовал не вмешиваться в Python, который поставляется с OS X. –

+0

Я бы рекомендовал не заменять системный python на намеренно несовместимую версию (будучи python 3.x) – Arafangion

1

Это может быть немного странно, предоставляя скрипт 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+"\[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; 
} 

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

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

Таким образом меняется от частного установки Perl к стандартному.

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

Смежные вопросы