質問
更新した私のpythonインタプリタだと思うんにはまだ呼び出されます。ックバージョンについて取得します:
$ python -V
Python 3.0.1
私の古い通訳者がまだ呼び出されます。私は次のコマンドを実行します:
python myProg.py
スクリプトを走ります。しかしを呼び出すと、コマンド
./myProg.py
を取得しますエラーメッセージ:
AttributeError: 'str' object has no attribute 'format'
では、旧通訳が呼び出されます。どうしたらいいですか?まMac OS X10.5.なんと最初の行には:
#!/usr/bin/python
まだ始まったpython、あまり知らないと解釈される言語なのでいいでいるのかもしれません。
編集:なんと、そのスピードが速かったです。おみやげをたくさん!
解決
スクリプトの最初の行、#!/usr/bin/python
、あなたは(最も可能性が高いことはMac OS Xに付属のもの)を/usr/bin/python
でPythonインタプリタを呼び出しているによると。あなたは、あなたのPythonインタプリタ3(そう/usr/local/bin/python
または/opt/local/bin/python
)をインストールしたパスにそのパスを変更する必要があります。 またはのあなただけの(あなたがインストールされ、新しいバージョンのようです)、あなたの#!/usr/bin/env python
変数で最初にリストされているpython
を呼ぶであろう、PATH
を読むためにその行を変更することができます。
他のヒント
まず、推奨シェバング行があります:
#!/usr/bin/env python
このお./foo.py
ときに呼び出されるPythonインタプリタは、コマンドラインからのpythonを起動したときに呼び出される同じインタプリタであることを確認します。
あなたの説明から、私はあなたがやった場合と思われます
which python
それはあなたが/usr/bin/python
明らかにしませんでした。これは、Python 3インタプリタが住んでいるところである、あなたに何かを与えるだろう。あなたは上記のおシェバング行を変更、またはwhich
によって返されたパスにPythonインタプリタへのパスを置き換えることができます。
which python
を試してみてください。私は自分の環境で使用されているのpythonインタプリタを教えてくれます。
それはスクリプトでのように/usr/bin/python
されていない場合は、お使いの疑いが確認されています。
でもがんを疑うことで、shebang線は、古いバージョン。も認しましょう:
1)版は、通訳ので/usr/bin/python:
/usr/bin/python -V
2)ここでは、python3通訳まで:
which python
に取得する場合、正しくつかのコマンドラインをごshebangこ:
#!/usr/bin/env python
補足: このまま置き換えに古いバージョンのpythonでは、シンボリックリンクをpython3にも注意する他の主要な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
実行 - 。これは別の答えを与えるの/ usr / binに/ pythonの、チェンジ#よりは/ usr / binに/ pythonの場合は、代わりにそのパスを持っている。
これは、Pythonの質問に答えるためにPerlスクリプトを提供する少し奇妙かもしれないが、それは全く同じように、それはPerlのために行うようにPythonのために働きます。これは、「修正インタプリタ」を意味し、「fixin
」と呼ばれるスクリプトです。それはあなたの現在のパスの正しい文字列にシェバング行を変更します。
#!/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;
}
のコードは、元のラクダブック(「プログラミングPerlの、初版)の同名のスクリプトから導出されます。このコピーは、それ以来、ビットをハッキングされている - といくつかのより多くをハッキングする必要があります。
:確かに、私はちょうど別の1台のMacからそれをコピーして、私は2番目にPerlの5.10.0をインストールしていませんでしたから、私が走った - しかし、私は定期的にそれを使用します$ perl fixin fixin
Changing fixin to /usr/bin/perl
$
これにより、標準的なものにPerlをインストールし、民間から変えます。
読者のための運動は - Pythonでスクリプトを書き換え
。