2009-05-24 47 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 

我剛開始用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,這將調用PATH變量(這似乎是您安裝的較新版本)中首先列出的python

2

run'which python' - 如果這給出與/ usr/bin/python不同的答案,請改變#!/ usr/bin/python來代替該路徑。

3

嘗試which python。我會告訴你在你的環境中使用了哪一種python解釋器。 如果它不是/usr/bin/python就像在腳本中,那麼你的懷疑被證實。

6

首先,推薦的家當行是:

#!/usr/bin/env python 

這將確保當你./foo.py是當你從命令行調用蟒蛇被調用相同的解釋要調用的Python解釋器。

從你的描述,我懷疑,如果你做:

which python 

它不會給你/usr/bin/python。它會給你一些其他的東西,這就是python 3翻譯器所在的地方。你可以修改你的shebang行到上面,或者用which返回的路徑替換python解釋器的路徑。

3

這很可能是你懷疑的,shebang行稱爲舊版本。有兩件事情你可能要檢查:

1)什麼版本是解釋位於/ usr /斌/ 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與Python 2.x不是100%向後兼容,因此存在破壞其中一些實用程序的風險。 – mipadi 2009-05-24 17:09:07

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; 
} 

該代碼由原始駱駝書('Programming Perl',first edition)中的同名腳本派生而來。此後,此副本已被黑客入侵 - 並且應該被更多黑客入侵。我卻用它經常 - 事實上,我只是複製它從一臺Mac到另一個,因爲我還沒有在第二安裝的Perl 5.10.0,我跑:

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

私營從而改變安裝Perl的標準之一。

讀者練習 - 用Python重寫腳本。