2009-02-01 15 views
17

मैं पायथन 2 कोड लिखने के लिए Emacs का उपयोग कर रहा हूं। अब मेरे पास पाइथन 2.6 और 3.0 दोनों मेरे सिस्टम पर स्थापित हैं, और मुझे पायथन 3 कोड भी लिखना है।Emacs में Python 2 और 3 दोनों

यहाँ कैसे विभिन्न संस्करणों/usr/bin में स्थापित कर रहे हैं:

python -> python2.6* 
python2 -> python2.6* 
python2.6* 

python3 -> python3.0* 
python3.0* 

इस स्थापित करने के लिए इतना है कि Emacs अजगर का सही संस्करण का उपयोग करता है, जो भाषा मैं कर रहा हूँ पर निर्भर करता है कोई तरीका है का उपयोग करते हुए? उदाहरण के लिए, सी-सी सी-सी वर्तमान में बफर चलाता है, लेकिन यह हमेशा पायथन 2.6 कहता है, भले ही मैं पायथन 3 कोड लिख रहा हूं।

+1

आप कैसे Emacs स्वचालित रूप से पता लगाने के लिए प्राप्त करने के लिए आप लिख रहे हैं कि क्या अजगर 2 कोड या अजगर 3 कोड, और सही अजगर संस्करण कॉल करने के लिए सोच रहे हैं? या आप पूछ रहे हैं कि Emacs को कैसे बदला जाए ताकि यह सभी मामलों में एक अलग आदेश (यानी पायथन 3) कहता है जब पाइथन कोड बफर में लोड हो जाता है? –

+0

स्पष्ट रूप से पहला आदर्श होगा, लेकिन यह बहुत कठिन लगता है, क्योंकि पाइथन 2 और पायथन 3 के बीच सिंटैक्टिक अंतर नाबालिग हैं। ऐसा लगता है कि इस सवाल के जवाब दूसरे मामले की देखभाल करते हैं। स्पष्टीकरण देने के लिए धन्यवाद। –

उत्तर

4

उत्तर हाँ है। यदि आप पाइथन 3 से पाइथन 2 को अलग कर सकते हैं, तो यह प्रोग्रामिंग का एक सरल मामला है जो आप चाहते हैं कि वह करने के लिए emacs प्राप्त करें।

(define run-python (&optional buffer) 
    (with-current-buffer (or buffer (current-buffer)) 
     (if (is-python3-p) 
       (run-python3) 
      (run-python2)))) 

(define-key python-mode-map (kbd "C-c C-c") #'run-python) 

सभी जो रह गई है लागू है is-python3-p और run-python3 (आदि)

10

आप अजगर-mode.el उपयोग कर रहे हैं आप py-which-shell को बदलने की कोशिश कर सकते हैं। आदेश की एक प्रति-फ़ाइल के आधार पर यह करने के लिए आप अपनी फ़ाइल की पहली पंक्ति में

# -*- py-which-shell: "python3"; -*- 

डाल सकते हैं - या दूसरी पंक्ति में अगर पहली पंक्ति #! साथ शुरू होता है। एक अन्य विकल्प के लिए अपनी फ़ाइल के अंत में

# Local Variables: 
# py-which-shell: "python3" 
# End: 

डाल करने के लिए है। शायद आपको सिर्फ "पायथन 3" के बजाय python3 का पूरा पथ देना चाहिए।

+0

फ़ाइल स्थानीय चर मेरे लिए काम नहीं करता है। ऐसा लगता है कि py-python-command को प्रभावी होने के लिए dotemacs में setq के साथ सेट किया जाना चाहिए। मैं अपने अन्य जवाब में मूल प्रश्न के बारे में विस्तृत जानकारी दूंगा। – Yoo

+0

मैंने पीई-पायथन-कमांड सेट करने का सुझाव दिया था लेकिन पायथन-मोड.एएल आंतरिक रूप से पीई-जो-शैल का उपयोग करता है और पीई-पाय-जो-शेल * के मूल्य पर पीई-जो-खोल सेट करता है * यह फ़ाइल-स्थानीय मान को देखता है। मैंने सीधे पीई-जो-खोल बदलने का सुझाव देने के लिए जवाब संपादित किया है। – cefstat

+0

मुझे संदेह है कि यह '(emacs) फ़ाइल वैरिएबल ' – phils

3

this answer पर मेरी टिप्पणी।

मैं /t/min.py जो python3 में ठीक लेकिन को Python2 में नहीं चलेंगे लिखा था (शब्दकोश समझ python3 में काम करता है)

की /t/min.py

#!/usr/bin/python3 
# -*- py-python-command: "/usr/bin/python3"; -*- 
a = {i:i**2 for i in range(10)} 
print(a) 

नोट सामग्री है कि शेबैंग python3 इंगित करता है और फाइल स्थानीय परिवर्तनीय py-python-command भी इंगित करता है।

मैंने /t/min-py.el भी लिखा है जो सुनिश्चित करता है कि python.el के बजाय python-mode.el (ver 5.1.0) का उपयोग किया जाता है।

/t/min-py.el की सामग्री

(add-to-list 'load-path "~/m/em/lisp/") 
(autoload 'python-mode "python-mode" "Python Mode." t) 
;; (setq py-python-command "python3") 

ध्यान दें कि अंतिम पंक्ति पर टिप्पणी की है।

मैं निम्न आदेश के साथ Emacs शुरू:

emacs -Q -l /t/min-py.el /t/min.py & 

अब emacs मेरे वैकल्पिक dotemacs के साथ शुरू किया गया है और यह /t/min-py.el /t/min.py खोलता है।

जब मैं पाइथन को बफर भेजने के लिए सी-सी सी-सी दबाता हूं, तो यह कहता है कि "के लिए" भाग गलत है और यह इंगित करता है कि Python2 के बजाय python2 का उपयोग किया जा रहा है। जब मैं सी-सी दबाता हूं! पायथन दुभाषिया शुरू करने के लिए, यह कहते हैं कि अजगर 2.5 शुरू हो गया है।

मैं/t/min की दूसरी पंक्ति भी बदल सकता हूं।इस के लिए पीई:

# -*- py-python-command: "chunkybacon"; -*- 

और यह प्रयोग फिर से करें और emacs अभी भी python2 का उपयोग करता है।

यदि /t/min-py.el की अंतिम पंक्ति पर टिप्पणी नहीं की गई है, तो सी-सी सी-सी और सी-सी! दोनों python3 का उपयोग करें।

+0

' के मुकाबले 'सी-एच i जी (emacs) निर्देशिका चर के लिए अधिक उपयोगी होगा ऐसा लगता है कि आपके स्थानीय चर का मूल्यांकन नहीं किया जाता है। क्या आप मूल्यांकन से पहले पुष्टि के लिए पूछ रहे संदेश को देखते हैं? अन्यथा 'सक्षम-स्थानीय-चर' का मान क्या है, यदि यह नहीं है कि आपके स्थानीय चर को अनदेखा किया गया है! – marcz

2
jrockway की टिप्पणी के बारे में

:

(defun is-python3-p() "Check whether we're running python 2 or 3." 
    (setq mystr (first (split-string (buffer-string) "\n" t))) 
    (with-temp-buffer 
    (insert mystr) 
    (goto-char 0) 
    (search-forward "python3" nil t))) 
(defun run-python() "Call the python interpreter." 
    (interactive) 
    (if (is-python3-p) 
     (setq py-python-command "/usr/bin/python3") 
    (setq py-python-command "/usr/bin/python")) 
    (py-execute-buffer)) 

यह python3 फोन करेगा, तो "python3" (, कुटिया आमतौर पर) अपने बफर के शीर्ष कतार में है। किसी कारण से (setq py-pyton-command ...) एक बार जब आप py-execute-buffer चलाते हैं तो आप संस्करणों को बदलने नहीं देते हैं। यह तब तक कोई मुद्दा नहीं होना चाहिए जब तक कि आप अपनी फ़ाइल को उसी बफर पर आगे और आगे नहीं बदलते।

1

वर्तमान python-mode.el शेबांग सम्मानित किया गया है।

सहभागितापूर्ण तरीके से बस के साथ

M-x pythonVERSION  
M-x python 

एक अजगर खोल खोल स्थापित डिफ़ॉल्ट कॉल करेंगे।

http://launchpad.net/python-mode

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