我更新了我的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并且对解释语言不太熟悉,所以我不太清楚发生了什么。
编辑:哇,这很快。非常感谢!
答案 0 :(得分:16)
根据脚本的第一行#!/usr/bin/python
,您在/usr/bin/python
调用Python解释器(很可能是Mac OS X附带的解释器)。您必须将该路径更改为安装Python 3解释器的路径(可能是/usr/local/bin/python
或/opt/local/bin/python
); 或您只需更改该行即可阅读#!/usr/bin/env python
,这将调用您python
变量中首先列出的PATH
(这似乎是您的新版本)安装)。
答案 1 :(得分:6)
首先,推荐的shebang系列是:
#!/usr/bin/env python
这将确保在./foo.py
时调用的python解释器与从命令行调用python时调用的解释器相同。
根据您的描述,我怀疑如果您这样做了:
which python
它不会给你/usr/bin/python
。它会给你一些其他东西,这是python 3解释器所在的地方。您可以将shebang行修改为上面的行,或者使用which
返回的路径替换python解释器的路径。
答案 2 :(得分:3)
试试which python
。我会告诉你在你的环境中使用了哪个python解释器。
如果脚本中没有/usr/bin/python
,那么您的怀疑就会得到确认。
答案 3 :(得分:3)
你怀疑的很可能是shebang系列正在调用旧版本。您可能想要检查两件事:
1)/ usr / bin / python中的解释器是什么版本:
/usr/bin/python -V
2)你安装的python 3解释器在哪里:
which python
如果从命令行中获得了正确的,请用以下内容替换shebang行:
#!/usr/bin/env python
附录:你也可以用python 3的符号链接替换旧版本的python,但要注意任何主要的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
答案 4 :(得分:2)
运行'which python' - 如果这给出了与/ usr / bin / python不同的答案,请更改#!/ usr / bin / python以改为使用该路径。
答案 5 :(得分: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+"\$@"}'
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更改为标准安装。
为读者练习 - 用Python重写脚本。