2009-05-24 22 views
10

कहा जाता है मैंने अपने पायथन दुभाषिया को अद्यतन किया, लेकिन मुझे लगता है कि पुराना अभी भी बुलाया जाता है। जब मैं संस्करण की जांच करता हूं तो मुझे मिलता है:गलत पायथन दुभाषिया को

$ python -V 
Python 3.0.1 

लेकिन मेरा मानना ​​है कि पुराने दुभाषिया को अभी भी बुलाया जा रहा है। जब मैं कमांड चलाता हूं:

python myProg.py 

स्क्रिप्ट ठीक से चलती है।

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

जो जाहिरा तौर पर पुराने दुभाषिया बुलाया जा रहा है की वजह से है: लेकिन जब मैं आदेश

./myProg.py 

साथ यह आह्वान मैं त्रुटि संदेश मिलता है। मैं इसे कैसे ठीक करूं? मैं मैक ओएस एक्स 10.5 चलाता हूं। यह पहली पंक्ति के साथ कुछ है:

#!/usr/bin/python 

मैं सिर्फ अजगर के साथ बाहर शुरू कर दिया और व्याख्या की भाषा से परिचित नहीं हूँ, इसलिए मैं भी यकीन है कि क्या चल रहा है नहीं कर रहा हूँ।

संपादित करें: वाह, यह तेज़ था। आपका बहुत बहुत धन्यवाद!

उत्तर

16

स्क्रिप्ट की पहली पंक्ति के अनुसार, #!/usr/bin/python, आप पाइथन दुभाषिया को /usr/bin/python पर कॉल कर रहे हैं (जो मैक ओएस एक्स के साथ जहाजों की सबसे अधिक संभावना है)। आपको उस पथ को उस पथ में बदलना होगा जहां आपने अपना पायथन 3 दुभाषिया स्थापित किया है (संभवतः /usr/local/bin/python या /opt/local/bin/python); या आप #!/usr/bin/env python पढ़ने के लिए बस उस पंक्ति को बदल सकते हैं, जो आपके PATH चर में पहले सूचीबद्ध python पर कॉल करेगा (जो आपके द्वारा स्थापित किया गया नया संस्करण प्रतीत होता है)।

2

रन 'कौन सा पायथन' - यदि यह/usr/bin/python से भिन्न उत्तर देता है, तो उस पथ के लिए #!/Usr/bin/python को बदलें।

3

which python आज़माएं। मैं आपको बताऊंगा कि आपके पर्यावरण में कौन सा पायथन दुभाषिया उपयोग किया जाता है। यदि यह /usr/bin/python स्क्रिप्ट में नहीं है, तो आपके संदेह की पुष्टि है।

6

सबसे पहले, की सिफारिश की कुटिया लाइन है:

#!/usr/bin/env python 

यह सुनिश्चित करें कि अजगर दुभाषिया जब आप ./foo.py ही दुभाषिया है कि जब आप कमांड लाइन से अजगर आह्वान शुरू हो जाती है है कि शुरू हो जाती है कर देगा।

अपने विवरण से, मुझे लगता है कि अगर आप ने क्या किया:

which python 

यह आप /usr/bin/python नहीं देना होगा। यह आपको कुछ और देगा, जहां पाइथन 3 दुभाषिया रहता है। आप या तो उपरोक्त में अपनी शेबांग लाइन को संशोधित कर सकते हैं, या पथ को पाइथन दुभाषिया में which द्वारा वापस लाए गए पथ के साथ प्रतिस्थापित कर सकते हैं।

3

यह संभवतः आपको संदेह है कि शेबांग लाइन पुराने संस्करण को बुला रही है।दो बातें आप जांच करना चाह सकते:

/usr/bin/python -V 

2) जहां अजगर 3 दुभाषिया आप स्थापित है:

which python 

1) कौन-सा संस्करण/usr/bin/अजगर पर दुभाषिया है

आप कमांड लाइन से सही एक मिल है, तो इस के साथ अपनी कुटिया लाइन की जगह:

#!/usr/bin/env python 

परिशिष्ट: तुम भी अजगर 3 करने के लिए एक सिमलिंक साथ अजगर के पुराने संस्करण की जगह सकता है, लेकिन सावधान रहना है कि किसी भी प्रमुख ओएस एक्स अद्यतन (यानी: 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 को प्रतिस्थापित करने का सबसे अच्छा विचार नहीं है। कुछ ओएस एक्स यूटिलिटीज/usr/bin/पायथन का संदर्भ ले सकते हैं, और चूंकि पाइथन 3K 100% पीछे नहीं है-पायथन 2.x के साथ संगत, आप उन कुछ उपयोगिताओं को तोड़ने का जोखिम चलाते हैं। – mipadi

+1

हाँ, मैं ओएस एक्स –

+0

के साथ आता है जो पाइथन के साथ गड़बड़ करने की सिफारिश करता हूं, मैं विशेष रूप से सिस्टम पाइथन को जानबूझकर असंगत संस्करण (पायथन 3.x) – Arafangion

1

पाइथन प्रश्न का उत्तर देने के लिए यह एक पर्ल स्क्रिप्ट प्रदान करने में थोड़ा अजीब हो सकता है, लेकिन यह पर्ल के लिए भी करता है और साथ ही यह पर्ल के लिए भी करता है। यह '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+"\[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; 
} 

कोड में वास्तविक कैमल बुक ('प्रोग्रामिंग पर्ल', प्रथम संस्करण) एक ही नाम के एक स्क्रिप्ट से ली गई है। तब से इस प्रति को थोड़ा सा हैक किया गया है - और कुछ और हैक किया जाना चाहिए। लेकिन मैं इसे नियमित रूप से उपयोग करते हैं - वास्तव में, मैं सिर्फ यह से एक मैक एक और को कॉपी किया है, और के बाद से मैं दूसरे पर पर्ल 5.10.0 स्थापित नहीं है, मैं भाग गया:

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

इस प्रकार निजी से बदल रहा है स्थापित मानक एक पर्ल।

पाठक के लिए व्यायाम - पायथन में लिपि को फिर से लिखें।

संबंधित मुद्दे