Вызывается неправильный интерпретатор python
-
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.