Неправильный интерпретатор Python называют

Мне нравятся свойства.

NSDate.date.timeIntervalSince1970;
11
задан Jonathan Leffler 2 August 2009 в 07:08
поделиться

6 ответов

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

16
ответ дан 3 December 2019 в 02:41
поделиться

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

3
ответ дан 3 December 2019 в 02:41
поделиться

Возможно, вы подозреваете, что линия 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
3
ответ дан 3 December 2019 в 02:41
поделиться

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

#!/usr/bin/env python

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

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

which python

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

6
ответ дан 3 December 2019 в 02:41
поделиться

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

2
ответ дан 3 December 2019 в 02:41
поделиться

Может показаться немного странным предоставление сценария 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;
}

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

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

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

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

1
ответ дан 3 December 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: