2009-05-24 31 views
10

私のPythonインタプリタが更新されましたが、古いものはまだ呼び出されていると思います。私がバージョンを確認すると、私は得る:間違ったPythonインタプリタが呼び出されました

$ python -V 
Python 3.0.1 

しかし、私は古い通訳がまだ呼び出されていると思います。

python myProg.py 

スクリプトが正常に実行されます。どうやら古いインタプリタが呼び出されているためです

AttributeError: 'str' object has no attribute 'format' 

:私はコマンド

./myProg.py 

でそれを呼び出すとき、しかし、私はエラーメッセージが表示されます。これをどうすれば解決できますか?私は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

Try which pythonあなたの環境で使用されているPythonインタプリタを教えてください。 スクリプトのように/usr/bin/pythonでない場合は、あなたの疑惑が確認されます。

6

まず、推奨シェバング行は次のとおりです。

#!/usr/bin/env python 

このお./foo.pyは、コマンドラインからのpythonを起動したときに呼び出される同じインタプリタであるときに呼び出されることを確認Pythonインタプリタを行います。

あなたの説明から、私はあなたがやったことが疑われる場合:

which python 

をそれはあなたに/usr/bin/pythonを与えないだろう。 Python 3インタプリタがどこにあるのか、それはあなたに別のものを与えるでしょう。シバン線を上に変更するか、またはPythonインタプリタへのパスをwhichによって返されたパスに置き換えます。

3

恐らくあなたが疑うところは、シバンラインが古いバージョンを呼び出しているということです。二つのこと、あなたがチェックすることをお勧めします:

/usr/bin/python -V 

2)がインストールのpython 3インタプリタです:

which python 

1)は/ usr/binに/ pythonので通訳がどのバージョンであります

コマンドラインから正しいものを得る場合には、これであなたのシェバング行を置き換える:

#!/usr/bin/env python 

補遺:あなたはまたのpython 3へのシンボリックリンクでのpythonの古いバージョンを置き換えますが、すべての主要なOS Xのアップデート(例:10.5.7へ10.5.6)がいることを注意してください可能性:

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

+1

ええ、OS Xに付属のPythonを使いこなすことをお勧めします。 –

+0

システムPythonを意図的に互換性のないバージョン(Python 3.x)に置き換えることをお勧めします。 – Arafangion

1

Pythonの質問に答えるためにPerlスクリプトを提供するのはちょっと奇妙かもしれませんが、Perlの場合と同様にPythonでもうまく動作します。これは 'fixin'と呼ばれるスクリプトで、「インタプリタを修正する」という意味です。これは、現在の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; 
} 

コードは、元のラクダブック(「プログラミングPerlの、初版)の同名のスクリプトから導出されます。このコピーはそれ以来ちょっとハッキングされています。もう少しハッキングする必要があります。

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

これにより民間インストールから変更:確かに、私はちょうど別の1台のMacからそれをコピーして、私は2番目にはPerl 5.10.0をインストールしていませんでしたから、私が走った - しかし、私はそれが日常使いますPerlから標準のものまで。

リーダーのためのエクササイズ - Pythonでスクリプトを書き直します。

関連する問題